配列(4) 配列中の要素を数える

配列に入っている要素の数を知るには……配列変数名の頭に「$#」を付ければいいみたいです。

# arrtest5.pl
my @arr = ("Zero", "First", "Second");
print $#arr, " Numbers!";

配列変数 @arr の要素数を知るために $#arr と書いています。正常に動けば「3 Numbers!」と表示されるはず。

D:\dev\perl>perl arrtest5.pl
2 Numbers!

あれれ。2 が出てしまいました。何ででしょう。もう一回 perlintro をよく読んでみます。
……
あ、ちょっと $#arr の意味が違ったようです。「要素の数」ではなく、「最後の要素の番号」という意味になるようです。@arr に入っている最後の要素は2番の"Second"ですから、$#arrでは「2」になってしまうんですね。
ということは、要素数$#arr + 1 という事になりますね。

# arrtest5.pl
my @arr = ("Zero", "First", "Second");
print $#arr + 1, " Numbers!";
D:\dev\perl>perl arrtest5.pl
3 Numbers!

できました。(^-^)
そして、perlintro を読み進めていくと……こんな記述がありました。

You might be tempted to use "$#array + 1" to tell you how many items
there are in an array. Don't bother. As it happens, using @array
where Perl expects to find a scalar value ("in scalar context") will
give you the number of elements in the array:

if (@animals < 5) { ... }

和訳すると「配列の中にアイテムが何個あるか知るために"$#array + 1"を使いたくなるでしょう。でもその必要はありません。スカラ値があると予想できる場所(スカラーコンテキスト)に @array と書けば、自動的にその配列の中のアイテム数が代わりに使われます。」
ガーン。先回りされた上に、どうやら $#arr + 1 と書く必要はなかったみたいです。
例文として if 文が使われていますね。後で勉強しますが、配列変数 @animals と、スカラー値である整数の 5 を比較しています。スカラー値と配列では比較できませんから、自動的に配列をスカラー値とする為に配列の要素数が使われる、というわけですか。
うーん。奥が深いなぁ。この辺りは、基礎が終わってから掘り下げていきたいと思います。