ご無沙汰しております。
my @a = split /,/,"";
warn length @a; # 1 # 訂正前
何を隠そう、ワシも時々やってしまうので。
Perlの配列要素数を、length()でやってはいけません。
This function cannot be used on an entire array or hash to find out how many elements these have. For that, use
scalar @arrayandscalar keys %hash, respectively.
手短には 0+@array 。
これだけ知っていれば使う分には十分なのだけど、length(@array)が構文として正しいとなると、一体どういう意味なのかも知っておきたいのがハカーの佐賀。
length @array # って一体…
というわけで答えを見る前に、一つクイズを。以下のコードは何を出力するか。
my @array = (1..42);
print length @array;
正解は、2。
ではこれは?
my @array = (0..0xffff);
print length @array;
正解は、5。
これでなんとなく察しがついたのではなかろうか。こういうことだったのである。
length @arraylength (scalar @array)length 65536length "65536"5
個人的には、"length"という単語を要素数にあてるのは不適切だと思っている。その意味でPerlのlength()が文字列の文字数を数える以外の意味を持たないのは正しい一方、文脈=contextを読みすぎてlength @arrayにあさっての答えを返してしまうのはひどい地雷だとも思う(use warnings;で警告してくれるとはいえ)。
要素数は"count"とかの方がよいのではないか。Objective-CやSwiftのように。
Dan the Man with too Many Elements to Count