Perlで無名( 変数(スカラー) | 配列(リスト) | 連想配列(ハッシュ) | 関数(サブルーチン) )を扱う際の覚え書きです。無名○○とは、名前からではアクセスできない “何か” という理解でいいかと思います。
とはいえ、何らかの手段でアクセスできないと使えないわけで、無名○○へのアクセスにはリファレンスを経由することになります。
そんなわけで、正しくは 「名前ではアクセス出来ないけれど、リファレンス経由ではアクセスできる “何か”」 となります。
例えば、変数(スカラー)のリファレンスを作る場合、
my $scalar = "A";
my $scalar_ref = \$scalar;
というように作るわけですが、中の値には $$scalar_ref というリファレンス経由でも、$scalar という名前経由でもアクセス出来るわけです。つまりこの場合の $scalar を失なれば “無名” というわけです。
●無名配列(リスト)へのリファレンス
# 作成方法
my $array_ref = [1, 2, 3, 4, 5];
# 参照方法
print $array_ref->[0], "\n";
print $$array_ref[0], "\n";
●無名連想配列(ハッシュ)へのリファレンス
# 作成方法
my $hash_ref = {"key1" => "A", "key2" => "B", };
# 参照方法
print $hash_ref->{'key1'}, "\n";
print $$hash_ref{'key1'}, "\n";
●無名関数(サブルーチン)へのリファレンス
# 作成方法
my $sub_ref = sub { my $str = shift;
return 'retuen '.$str; };
# 参照方法
my $ret_val = $sub_ref->('OK!');
print $ret_val, "\n";
無名関数を作る場合は、サブルーチンの閉じ } の後ろのセミコロン(;)をよく忘れるので、注意。
●無名変数(スカラー)へのリファレンス
# 作成方法
sub MakeScalarRef{
my $tmp;
return \$tmp;
}
my $scalar_ref = MakeScalarRef();
# 参照方法
print $$scalar_ref, "\n";
サブルーチンを使って、無理やり無名変数へのリファレンスを作るわけですね。
実は、単純に以下の要領でも作れるんじゃないかと思ったんですが・・・
my $ref1 = \2;
my $ref2 = \"A";
これだと定数へのリファレンスとなってしまい、参照は出来るんですが値の代入はできないんですよ。まぁ、スタティックなリファレンスという意味では使えるかも。
応用例
無名○○の最大のメリットは、簡単に複雑なデータ構造を作れる事じゃないかと思います。例えば
my $ref = [0, [1,2,3], {'key1' => 'A', 'key2' => 'B'}];
# 配列の最初の要素にアクセス
print $ref->[0], "\n";
# 配列の2番目の要素の3番目の値にアクセス
print $ref->[1]->[2], "\n";
print $ref->[1][2], "\n";
print $$ref[1][2], "\n";
# 配列の3番目の要素のキーが 'key2' の値にアクセス
print $ref->[2]->{'key2'}, "\n";
print $ref->[2]{'key2'}, "\n";
print $$ref[2]{'key2'}, "\n";
みたいな感じです。参照方法もいろいろとありますので、お好みに合わせてどうぞ。
無名関数はそんなに使うことは無いんですが、「ある機能を1つのサブルーチンに収めたいんだけど、複数回同じ処理が現れるのはエレガントじゃないよね」 というときに、関数の中だけで有効な関数を作る時に使ったかな。