配列のリファレンス
Perlには配列のリファレンスというデータ構造が頻繁に登場します。このページでは、リファレンスの中から配列のリファレンスを詳しく取り上げます。
配列のリファレンスとは
配列のリファレンスとは、配列に対するリファレンスのことです。リファレンスというのは、指すということを表します。配列に対して、リファレンス生成子「\」を使用すると、配列のリファレンスを作成することができます。
# 配列のリファレンスを作成 my @nums = (1, 3, 5); my $nums_ref = \@nums;
配列のリファレンスは、スカラ変数に代入されるとういうことに注意してください。
配列のリファレンスのイメージを以下に書いてみます。
# イメージ @nums $nums_ref -------> (1, 3, 5)
配列のリファレンスは、配列そのものではなく「配列を指し示すもの」を表現します。
配列のリファレンスは代入で中身がコピーされない
配列と配列のリファレンスの違いをここから見ていきましょう。
配列は、代入によって、中身がすべてコピーされますが、配列のリファレンスはコピーが行われません。
# 配列は値がコピーされる my @nums1 = (1, 3, 5); my @nums2 = @nums1; # 配列のリファレンスは値はコピーされない my @nums1 = (1, 3, 5); my $nums_ref1 = \@nums1; my $nums_ref2 = $nums_ref1;
以下はイメージです。配列の場合は、中身すべてがコピーされるのに対して、配列のリファレンスは、中身ではなく、リファレンスそのものがコピーされます。
# イメージ @nums1 @nums2 (1, 3, 5) (1, 3, 5) $nums_ref1 ------------> $nums_ref2 ------------> (1, 3, 5)
サブルーチンに渡す場合は、配列のリファレンスを渡す方が、中身のコピーが行われないので、効率が良くなります。
# サブルーチンに配列のリファレンスを渡す my_func($nums_ref1);
無名配列生成子
配列のリファレンスは、リファレンス生成子「\」を使用すると作成できますが、少し手間がかかります。すぐに配列のリファレンスを作成するために、無名配列生成子と呼ばれる演算子が定義されています。
my $nums_ref = [1, 3, 5];
通常の配列が「()」で作成されるのに対して、配列のリファレンスは無名配列生成子「[]」を使って生成されているのに注意してください。
Perlのソースコードでは、この記法が頻繁に登場します。配列なのか、配列のリファレンスなのかをソースコードから読み取ることが大切です。
# 配列 my @nums = (1, 3, 5); # 配列のリファレンス my $nums = [1, 3, 5];
デリファレンス
配列のリファレンスを生成するには、リファレンス生成子を使いました。今度は反対に配列のリファレンスから、配列を取り出してみましょう。
そのためにはデリファレンスという操作を行います。
my $nums_ref = [1, 3, 5]; # デリファレンス my @nums = @{$nums_ref};
デリファレンスは「@{配列のリファレンス}」という記法を使って行うことができます。
配列のリファレンスがスカラ変数の場合は「{}」を省略することもできます。
my @nums = @$nums_ref;
標準関数に引数として渡す
shift関数、unshift関数、pop関数、pushなどの配列に関する関数は、引数に配列をとります。そのため、配列のリファレンスを渡したい場合は、デリファレンスする必要があるので注意してください。
# デリファレンスして標準関数に渡す shift @$array; unshift @$array, $element; push @$array, $element; pop @$array;
配列のリファレンスから配列の値を取り出す
配列のリファレンスから配列の値を取り出すにはアロー演算子「->」を使うことができます。
# 配列のリファレンスから配列の値の取得 my $num = $nums_ref->[3]; # 配列のリファレンスから配列の値を設定 $nums_ref->[3] = 67;
アロー演算子が使われている場合は、配列のリファレンスです。そうでない場合は、配列です。これもソースコードの中で、しっかり読み取れるようになってください。
# 配列の値の取得 my $num = $nums[3]; # 配列の値を設定 $nums[3] = 67;
アロー演算子のあるなしだけで、配列なのか配列のリファレンスなのかが異なるので、しっかり見ることが大切です。
ハッシュのリファレンス
配列のリファレンスと同じくらい頻繁に利用されるものとしてハッシュのリファレンスがあります。
my $score_ref = {math => 78, english => 89};
ハッシュのリファレンスについては以下で詳しく解説しています。