Tip's
#2 リファレンスについて (Perl)
Perl5 から導入。ハッシュの中に配列を突っ込んだり、配列の中にハッシュを突っ込んだりできます。変数の前に \ をつければリファレンスが得られ、
リファレンス変数の前に変数を取り出す記号 ($, @, %) をつければリファレンスの中身が得られます。
$ref = \$val; # $ref にスカラ値へのリファレンスを入れる
$ref = \@array; # $ref に配列へのリファレンスを入れる
$ref = \%hash; # $ref にハッシュへのリファレンスを入れる
$val = $$ref; # $ref からスカラ値を取り出す
@array = @$ref; # $ref から配列を取り出す
%hash = %$ref; # $ref からハッシュを取り出す
$val = $array_ref[0];
$val = $hash_ref{'name'};
配列の0番目の要素を取り出すって時は @array[0] じやなくて $array[0] で、リファレンス風に読めば array の0番目をスカラ値として
取り出すって感じですもんね。といか、配列の要素が $ である理由が、リファレンスやってやっとこさ分かりました。こういう理由
だったんですね。
ハッシュの中にハッシュ
作成もアクセスも簡単ですが、each() で返る値(参照)は実体を指すように(キャスト)しないといけません。
(saample)文字列を分割して配列に入れます。文字をキーとしたハッシュを作成し、同じ文字が出現したらカウンタを上げます。
(saample)文字列を分割して配列に入れます。文字をキーとしたハッシュを作成し、同じ文字が出現したらカウンタを上げます。
#!/usr/bin/perl
# $str文字列を分割して配列に入れます。文字をキーとしたハッシュを作成し、
# 同じ文字が出現したらカウンタを上げます。
$str = "abjihdkgincksbetqoplomvubzmnnbvxuwytrfhasiqplapsljfuenrybcibnxjalke";
%hashName = ();
{
for (my $nPos = 0; $nPos < length($str); $nPos++)
{
$tmp = substr($str, $nPos, 1);
if (!($hashName{$tmp}))
{
$hashName{$tmp} = { 'count'=>1 }; # new hash
}
$hashName{$tmp}{'count'}++;
}
}
while (($name, $value) = each(%hashName))
{
%ref = %$value;
print ("$name = $ref{'count'}, ");
}
exit;
フォルダ一覧(再帰)
なぜか親フォルダをopen したままだと上手く動かない。
#!/usr/bin/perl
@listFile = &getFolder(".");
foreach $tmp (@listFile)
{
print ("$tmp,\n");
}
exit;
sub getFolder()
{
my $dirname = $_[0];
my @listFile = ();
my @listFolder = ();
{
opendir(DIR, $dirname);
{
while (defined(my $dir = readdir(DIR)))
{
if (!($dir eq "." or $dir eq ".."))
{
my $dirTmp = $dirname."/".$dir;
my $type = -d "$dirTmp" ? "D" : "F";
if ($type eq "F")
{
push(@listFile, substr($dirTmp, 1));
}
else
{
push(@listFolder, $dirTmp);
}
}
}
}
closedir(DIR);
}
{
foreach $tmp (@listFolder)
{
push(@listFile, &getFolder( $tmp ));
}
}
return (@listFile);
}
Perlモジュール
cgi-bin.pl は汎用ライブラリです。@INC はライブラリの検索パスらしい。
push(@INC, './lib');
require 'cgi-lib.pl';
print &PrintHeader();