
本格的添削はあとまわしにして、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