読者です 読者をやめる 読者になる 読者になる

ハッシュとハッシュリファレンス、それぞれの値を取り出す復習

Perl入学式 perl

前回からのスピンオフ。
Perl入学式in東京第3回復習問題vote.pl(再チャレンジ編) - draft

ハッシュやハッシュリファレンスを扱ってるときに、こんな書き方と、

$hash{key}

こんな書き方があったとして、

$hash->{key}

その違いがよく分かってなかったんだけど、これは前者がハッシュの値にアクセスするものであるのに対し、後者がハッシュリファレンスの値にアクセス(デリファレンス)する内容だったということみたいです。

僕は前者が後者の「略記」なんだっけね、としばらく思ってたんだけど、そうではないらしい、とおぼろげに感じ始め、そのことを明確に確認するために、以下みたいのを作ってみました。

んで、ここで確認したいのは、$result2 と $result3 が動くのかどうか、ということですが、実行すると、こんなこと言われます。

Global symbol "$hash" requires explicit package name at hash_ref_test.pl line 17.
Global symbol "%ref" requires explicit package name at hash_ref_test.pl line 18.

はい。ええ、どちらもダメだと。まさに思い通りのエラーをいただいています。

つまり、ハッシュにおける「$hash{key}」とハッシュリファレンスにおける「$hash->{key}」は略記するかしないかの関係ではなくて別個だってことですね。

ただしというか、もちろんというか、途中で以下を入れれば、

my $hash = \%hash;

$result2 は動作しますね。この時、$result1も普通に動くので、そういうところの現象だけ見て略記なのかな〜、と思ったんだと思いますが。

まだまだハッシュおよびリファレンス(配列のも含む)についてはよく分かってないこと多いんですが、ちょっとずつ感覚わかってきたかなあ・・
いずれにせよ、こういう小さい例を書いて、理解の曖昧なところをひとつずつ確認していくっていうのは今の自分には有効な気がしています。基礎がグラグラだと、どんどんやることの魔術化が加速していきそうな予感がする。

ちなみに、今回の内容を確認するにあたり、Perl入学式の以下の資料をあらためて念入りに確認しましたが、以前には見落としてた(というか目に入ってもキャパを超えて許容できなかった)情報が多くて、非常に参考になりました。ありがとうございました。
workshop-2013-03/slide.md at master · perl-entrance-org/workshop-2013-03 · GitHub