camel

本格的添削はあとまわしにして、Perlに限らないつっこみどころを先に。

ソースを見てすぐわかるのは、ハッシュキーの存在確認をdefinedでしているところ。このソースの場合たまたま動いてしまっているけど、「値が未定義」なのと「そもそも存在しない」とでは意味も異なる。以下のcode snippetを動かしてみれば、その違いがよくわかる。

my %hash = ( key => undef );
while(my ($k, $v) = each %hash){
  printf "exists  \$hash{$k} = %d\n", exists  $hash{$k};
  printf "defined \$hash{$k} = %d\n", defined $hash{$k};
}

ちなみにこのハッシュキーの存在確認、困った事にLLごとに微妙に異なる。以下備忘録。

Perl 5
exists $h{$k}
上記のとおり
Perl 6
exists %h{$k}
%h.exists($k)
OO版もある。
Python
h.has_key(k)
Pythonではhashではなくdictionaryないしmappingと呼ばれる。
Ruby
h.has_key?(k)
h.include?(k)
h.key?(k)
h.member?(k)
これだけあってなんでHash#exists?()Hash#exists()もないのかが不思議
JavaScript
k in h
JavaScriptでは(Non-Atomic)ObjectはみんなHash。上の構文はArrayであってもOK(1 in [null, null])

他にもHashを組み込みで持つLLは少なくないと思うのだけど、とりあえず思いつくまま。追補うぇるかむ。

Dan the Hash (Ab)?user

学生応援TB