リファレンス/ デリファレンス
(3)
リファレンス
配列やハッシュといった変数をサブルーチンへの引数としてそのまま使うと,
sub foo {
my(@arg_a, @arg_b) = @_;
}
my @a = (1, 2, 3);
my @b = (4, 5, 6);
foo(@a, @b);
こういったコードを書いたときに,@arg_
には@a
の内容が,@arg_
には@b
の内容が入ることが期待されますが,@arg_
の中に@a
と@b
の内容が入ってしまいます。これは,
@_ = (@a, @b);
という擬似コードのような形で,@arg_
に@_
のすべての内容が渡されます。
そこでリファレンスの出番です。リファレンスは値を記録する代わりに,
リファレンスは,
sub foo {
my($arg_a_ref, $arg_b_ref) = @_;
}
my @a = (1, 2, 3);
my @b = (4, 5, 6);
my $a_ref = \@_;
my $b_ref = \@_;
foo($a_ref, $b_ref);
このように,
デリファレンス
このようにして作成したリファレンスが指している実体の値にアクセスすることを,
デリファレンスするときは,$,
をリファレンスを格納している変数の頭に付けます。アロー->
)
sub foo {
my($arg_a_ref, $arg_b_ref) = @_;
print $arg_a_ref->[0]; # 1
print $arg_b_ref->[0]; # 4
}
以降では,
配列
リファレンス
配列のリファレンスを作成する場合,
my @array = qw/a b c d e/;
my $array_ref = \@array;
上記のようにわざわざバックスラッシュをつけてリファレンスを取得しなくても,[]
を使います。
$array_ref = [1, 2, ['a', 'b', 'c']];
デリファレンス
リファレンスにはあくまでもメモリ上の場所が格納されているため,@
を付けて配列全体として参照するか,
my $array_ref = ["blue", "red", "black"];
print "My first color is:" . $array_ref->[0] . "\n";
# My first color is: blue
デリファレンスの際の書き方は3種類あり,
print $array_ref->[0]; # blue
print ${$array_ref}[0]; # blue
print $$array_ref[0]; # blue
@演算子を使ったデリファレンス
リファレンスを作成し,
my $array_ref = ["blue", "red", "black"];
foreach my $color ( @{$array_ref} ){
print "color is $color \n";
}
実行結果は次のようになります。
color is blue
color is red
color is black
リファレンスの変数をそのまま表示する
配列のリファレンスをデリファレンスせずに表示するコードは次のようになります。
print "Reference: " . $array_ref . "\n";
実行結果は次のようになります。
Reference: ARRAY(0x1008d0040)
ARRAY(16進数)
の16進数
部分はメモリ上の場所を意味しています。ARRAY
はリファレンスの型が配列だということを表しています。もし後述するハッシュのリファレンスだった場合にはARRAY
の部分がHASH
になります。