TIL

Perlの配列アクセスを勘違いしていた

Perlで配列の要素を参照する方法を、長い間勘違いしていたことを学んだ。

Perlの配列は@hogeで宣言して、2番目の要素は@hoge[1]でアクセスするものだとばかり思っていたのだけど、値へのアクセスは$hoge[1]が正しいということを知った。言語仕様を体系的に理解せずに使ってると陥る悪い例である。

発覚の経緯は、職場のPerl専門家に「なんで配列は@で要素アクセスするのに、ハッシュは%じゃなく$で要素アクセスするんですか?」と聞いたことによる。

$はスカラを示すシジルであって、配列の要素ひとつひとつはスカラなので$で要素参照するとのこと。なるほど。宣言時に付けたシジルがついて回るわけではなく、どのように参照したいかによってシジルを変えるということのようだ。

それでも納得いかなかったのが、以下のように@hoge[1]で参照しても要素を見られること。

my @hoge = (100,200,300);

print @hoge[1]; #=> 200

print $hoge[1]; #=> 200

$@どっちでもアクセスできるなんてどうなっているのだ・・・!?と思って混乱しかけたけど、use warnings;を付けたらちゃんと怒られた。

Scalar value @hoge[1] better written as $hoge[1] at hoge.pl line 4.

そんなに気を遣ってくれなくてもいいんだよPerlさん・・・

ちなみに動作確認時のPerlバージョンは5.30.2

疲れたので寝よう。


<< 記事一覧へ