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 - 無名配列

このアーカイブについて

このページには、2008年7月以降に書かれたブログ記事のうちPerlカテゴリに属しているものが含まれています。

前のアーカイブはPerl: 2008年6月です。

次のアーカイブはPerl: 2008年12月です。