本格的添削はあとまわしにして、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
k in h
kが変数としてもディクショナリのキーとしても定義されてるときは:
h.has_key("k")
"k" in h