配列のサイズを求めるには、いくつかの異なる方法があるように思います。これらの3つの方法の違いは何ですか?
my @arr = (2);
print scalar @arr; # First way to print array size
print $#arr; # Second way to print array size
my $arrSize = @arr;
print $arrSize; # Third way to print array size
まず、2番目は他の2つと同等ではありません。$#array
は配列の最後のインデックスを返しますが、これは配列のサイズよりも1つ小さい値です。
他の2つはほとんど同じです。スカラーコンテキストを作成するために2つの異なる手段を使っているだけです。結局、読みやすさの問題になります。
個人的には次のようなものがいいと思います。
say 0+@array; # Represent @array as a number
よりも明確であると思います。
say scalar(@array); # Represent @array as a scalar
と
my $size = @array;
say $size;
後者はこのように単独では非常にわかりやすく見えますが、他のコードの一部となると、余分な行がわかりやすさを損ねてしまうことがわかります。これは、@array
がスカラコンテキストで何をするかを教えるのに便利ですし、$size
を何度も使いたい場合にも便利です。
これは、配列を強制的にスカラコンテキストに変換することでサイズを取得し、その中でサイズとして評価されます。
print scalar @arr;
これは、配列をスカラ変数に代入しているので、配列を強制的にスカラコンテキストにする別の方法です。
my $arrSize = @arr;
これは配列の最後の要素のインデックスを取得するので,実際にはサイズから1を引いた値になります(インデックスが0から始まると仮定して,Perlでは調整可能ですが,そうすることは通常はよくありません)。
print $#arr;
{{10212884}} この最後のものは、配列のサイズを得るために使うにはあまり適していません。配列の最後の要素を取得したい場合には便利です。
my $lastElement = $arr[$#arr];
また、Stack Overflowにあるように、この構文はほとんどのシンタックスハイライターでは正しく扱われません...