Perl: 2008年7月アーカイブ
Perlでは、サブルーチンへのリファレンスを作って変数に格納することができます。
例
use strict;
sub greets {
print "hello\n";
}
my $ref = \&greets;
この例では、greetsサブルーチンへのリファレンスを、$refに格納しています。デリファレンス
$refをデリファレンスして元のサブルーチンを呼び出す方法まずおさらい。
普通のサブルーチン呼出はこう書きます。
&greets(); # → hello ここで、
サブルーチン名 → {$ref}
と置き換えると、
$refをデリファレンスして元のサブルーチンを得ることができます。
&{ $ref }(); # → hello
デリファレンスの省略記法
下記のコードはすべて同じ動作をします。
&{$ref}();
&$ref();
$ref->();
無名配列コンストラクタ [ ] を使って、ネストされたリファレンスを作ることができます。
例1
my $ref = [ [ 1, 2, 3 ] , [ 2, 4, 6 ] ] ;これは、次のコードと同じような働きをします。
例2
my @array1 = ( 1, 2, 3 );
my @array2 = ( 2, 4, 6 );
my @array_all = ( \@array1, \@array2 );
my $ref = \@array_all;
デリファレンス
値を取り出すときはデリファレンスします。print $ref->[1]->[1]; # 出力 4
または
print $ref->[1][1]; # 出力 4
2次元配列
上の例を見ると、2次元配列によく似ていることがわかると思います。
Perlではこのようにして2次元配列を実現します。
もちろん、ネストを重ねれば多次元配列を作れます。
例1
my $ref = [ 2, 4, 6 ];
これは、下記と同じような働きをします。例2
my @array = ( 2, 4, 6 );
my $ref = \@array;
例2での@arrayに相当する中間変数が、例1にはありません。
このとき例1の$refには、「名前の無い配列」へのリファレンスが格納されています。
[ 2, 4, 6 ]における [ ]のことを
無名配列コンストラクタ
といいます。
参考: Perl再入門 | アルパカ本に学ぶリファレンス入門4 - 無名配列