Perlで無名(変数|配列|ハッシュ|関数)を扱う際の覚え書き
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つのサブルーチンに収めたいんだけど、複数回同じ処理が現れるのはエレガントじゃないよね」 というときに、関数の中だけで有効な関数を作る時に使ったかな。