ご無沙汰しております。
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 @array
andscalar 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 @array
length (scalar @array)
length 65536
length "65536"
5
個人的には、"length"という単語を要素数にあてるのは不適切だと思っている。その意味でPerlのlength()
が文字列の文字数を数える以外の意味を持たないのは正しい一方、文脈=contextを読みすぎてlength @array
にあさっての答えを返してしまうのはひどい地雷だとも思う(use warnings;
で警告してくれるとはいえ)。
要素数は"count"とかの方がよいのではないか。Objective-CやSwiftのように。
Dan the Man with too Many Elements to Count