Perlのリファレンス記述で初学者がつまずくポイント
リファレンスの書き方を混同してしまうケース
まずは変数である配列やハッシュの宣言やデータの格納方法を思い出してみましょう。配列やハッシュへ格納されるデータはリスト形式のデータが使用され、リスト形式のデータの書き方は列挙された値を()で括ります。
# 配列を宣言し値を格納する my @month = ("April", "May", "June"); # ハッシュを宣言し値を格納する my %price = ("apple" => 120, "strawberry" => 540, "orange" => 298, );
配列やハッシュから各個別の値を取り出す方法は、変数名のシジル@や%を$に変更し、[]や{}を使用して各個別の値を直接指定します。
# 配列の先頭から2つ目のデータを取り出す print "$month[1]\n"; # ハッシュからキーが’orange’の値を取り出す print "$price{'orange'}\n";
一方、配列やハッシュのリファレンスを作成する時は以下のコードの様に書きます。リファレンスを表す変数のシジルは$を使用します。格納されるデータは列挙された値を[]や{}で括ります。
# 配列リファレンスを宣言し参照先に値を格納する my $eto_arrayref = ["子", "丑", "寅"]; # ハッシュリファレンスを宣言し参照先に値を格納する my $price_hashref = {"tuna" => 220, "mackerel" => 100, "salmon" => 150};
配列やハッシュとリファレンスを見比べてみると、同じ記号が用いられよく似ていますが完全に記述が異なっている事が分かります。また、リファレンスの参照先の実データを取り出すことをデリファレンスと呼びますが、リファレンスから個別の値をデリファレンスして値を取り出す時は、[]や{}に加えて->を用いて以下の様にコードを書きます。
# 配列リファレンスから0番目の値を取り出す print "$eto_arrayref->[0]\n"; # ハッシュリファレンスからキーが'mackerel'の値を取り出す print "$price_hashref->{'mackerel'}\n";
以上のようにデータを格納する時に()を使うのか又は[]や{}を使うのか、個別の値を取り出す時に->を使うのか使わないのか、文法を完全に覚えきってしまえば混同する事は無いのですが、初学者がなんとなく文法を思い出しながらコードを書くと混同して間違った記述をしてしまうケースがあり、間違った記述のままコードを実行してしまうと想定していた結果が得られず余計に分からなくなってしまうといった事があります。