スポンサーリンク

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つのサブルーチンに収めたいんだけど、複数回同じ処理が現れるのはエレガントじゃないよね」 というときに、関数の中だけで有効な関数を作る時に使ったかな。

スポンサーリンク
コメント
Verify your Comment
Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

コメントを投稿
トラックバック

このページのトラックバックURL:
https://www.typepad.com/services/trackback/6a01310f1f31c0970c01538f531381970b

このページへのトラックバック一覧 Perlで無名(変数|配列|ハッシュ|関数)を扱う際の覚え書き:


プロフィール

ブログ内検索

Licenses

  • Creative Commons License

OTHER

  • このブログのはてなブックマーク数

Blog powered by TypePad

スポンサーリンク