リファレンス変数

Perl にはリファレンス型の変数が用意されている。一般的な変数は値を保存するが、リファレンス型の変数は値のアドレスを保存する。これを利用することで、二次元配列、二次元ハッシュ、または配列のハッシュなどの複雑なデータ構造を実現することができる。

リファレンス変数の宣言

リファレンス型の変数は、変数名の前に $ を付ける。これは普通のスカラー変数と区別しにくい。リファレンス変数は、アドレスを保存する変数である。そのため、リファレンス変数を利用するときは、代入対象のアドレスを予め調べておく必要がある。アドレスを調べるには \ を利用する。

配列のリファレンス

リファレンス変数に配列を代入する場合は 2 通りの方法がある。1 つは、配列 @arr を先に作り、そのアドレスを $ref_arr に代入する。もう 1 つの方法は、@arr を作らずに、最初からリファレンス変数に配列を代入することである。

my @arr = ('A', 'C', 'G', 'T');
my $ref_arr = [];
$ref_arr = \@arr;

my $ref_arr = ['A', 'C', 'G', 'T'];

ハッシュのリファレンス

ハッシュをリファレンス変数に代入する場合も、配列と同様に 2 通りの方法がある。

my %hash = ('AUG' => 'M', 'GUA' => 'V');
my $ref_hash = {};
$ref_hash = \%hash;

my $ref_hash = {'AUG' => 'M', 'GUA' => 'V'};

リファレンス変数から値を取得

リファレンス変数にはアドレスが保存されている。変数名に $ を付けると、そのアドレスを参照することになる。

スカラー変数

例えば、普通の変数のリファレンスを例にすると、以下のように $$ で値を取得できる。

my $pi = 3.14;
my $ref = \$pi;

print $ref;
## SCALAR(0x1148d88)

print ${$ref};
## 3.14

$$ は次のように理解するとわかりやすい。$pi = 3.14 がまず与えられている。続いて $ref = \$pi が定義されている。このとき、$\ は関数とその逆関数のようなものと考えれば、$$ref = $($ref) = $(\$pi) = $(\$)pi = $pi = 3.14 となる。

配列

配列の場合はアロー演算子 -> を用いて、各要素を取得する。

my @arr = (1, 1, 2, 3, 5, 8, 13);
my $ref = \@arr;

print $ref->[0]; 

print $ref->[3];

配列の要素をすべて取得する場合は、以下のように for 文を用いる。

my $ref = [1, 1, 2, 3, 5, 8, 13];

for (my $i = 0; $i < @{$ref}; $i++) {
    print $ref->[$i];
}

$ref には配列のアドレスが保存されている。@{$ref} とすることで、$ref の指すアドレスを辿って配列を見つけ、それを配列に復元することができる。

ハッシュ

ハッシュの場合はアロー演算子 -> を用いて、各要素を取得する。

my %hash = ('AUG' => 'M', 'GUA' => 'V');
my $ref = \%hash;

print $ref->{'AUG'};

print $ref->{'GUA'}

すべてのキーと値を取り出す場合は、配列と同様に %{$ref} を利用して、リファレンスをハッシュに復元させてから、for 文あるいは while 文を利用する。

my $ref = {'AUG' => 'M', 'GUA' => 'V'};


for my $key (keys %{$ref}) {
    print $ref->{$key};
}

while (my ($key, $val) = each %{$ref}) {
    print "$key   ===>   $val";
}