Perl

リファレンス

データに直接アクセスするのではなく、データの存在するメモリアドレスをスカラ値として定義するリファレンスを使用することができる。スカラ、配列、ハッシュ、ファイルハンドル、サブルーチンのリファレンスが存在する。
my $scalar_ref = \$scalar; # スカラへのリファレンス
my $array_ref  = \@array;  # 配列へのリファレンス
my $hash_ref   = \%hash;   # ハッシュへのリファレンス
my $sub_ref    = \⊂    # サブルーチンへのリファレンス
open my $fh, '<', $file;   # $fhがファイルハンドルへのリファレンス
参照元にアクセス、すなわちデリファレンスするには、シジルを変数名の頭につければよい。
my $scalar = $$scalar_ref;
my @array  = @$array_ref;
my %hash   = %$hash_ref;
my $sub    = &$sub_ref(2, 3); # サブルーチン呼び出し -- $sub には戻り値が入る
ただし、配列・ハッシュおよびサブルーチンへのリファレンスに関しては、その要素にアクセスするのに(あるいはサブルーチンを呼び出すのに)->を使うことができる。
$array_ref->[0];
$hash_ref->{two};
$sub_ref->(2, 3);
配列・ハッシュについては、配列名・ハッシュ名が定義されておらずリファレンスからのみアクセスできる無名配列・無名ハッシュを作成することができる。
my $array_ref = [0, 1, 2];                       # 無名配列
my $hash_ref  = {zero => 0, one => 1, two => 2}; # 無名ハッシュ
また、無名サブルーチンを作ることもできる。
my $sub_ref = sub { $_[0] * $_[1] };
print $sub_ref->(2, 3), "\n"; # 6 を出力
print &$sub_ref(2, 3),  "\n"; # こうも書けるが、読みにくいためあまり使われない
参照元のデータタイプを調べるには、refを使う。
ref 1;           # ''
ref $scalar_ref; # 'SCALAR'
ref $array_ref;  # 'ARRAY'
ref $hash_ref;   # 'HASH'
参照元がオブジェクトの場合、refはそのオブジェクトが所属するパッケージ名(クラス名)を返す。
ref Foo::Bar->new(); # たいてい 'Foo::Bar'

戻る