2013-04-30 12 views
5

ハッシュリファレンスに0要素が含まれているかどうかをテストする必要があります。 私はこのコードを使用:perlでハッシュリファレンスが空であるかどうかをチェックする方法

$self = { fld => 1 }; 
%h = ("a" => "b"); 
$self->{href} = { %h }; 
print STDERR $self->{href}{ "a" }; 
print STDERR "\n"; 
print "size of hash: " . keys(%h) . ".\n"; 
print "size of hashref: " . keys($self->{href}) . ".\n"; 

それはperlの5.16でうまく動作しますが、perlの5.10で失敗します。

Type of arg 1 to keys must be hash (not hash element) at - line 7, near "}) " 
Execution of - aborted due to compilation errors. 

答えて

12

あなたはハッシュのため

%hash 

を使用したい場合は、あなたがそう、参考のために

%{ $hash } 

を使用したいですそれは

keys %{ $self->{href} } 

注:一部のバージョンのP erl、keysは参照を受け入れます。しかし、これは放棄された実験的な機能でした。 1つは使用しないでください。

+0

を取得します。 Perlのすべてのバージョンで同じように動作する予定ですか? –

+0

いいえ、それは放棄された実験的な機能でした。 – ikegami

+0

これは空か0になりますか? – landesko

2

keysのような組み込み関数での参照を使用してのみ、新しいのPerlでサポートされています。最大の互換性のためには、まずそれを間接参照する必要があります。

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
2

あなたはハッシュとしてそれを間接参照する必要があります。それはすべてのキーを持っているかどうかを確認するために、TIMTOWTDIについては

print "size of hashref: ", keys %{ $self->{href} }, "\n"; 

、あなたはkeysは必要ありません。

print "undefined" unless %{ $self->{href} }; 
+1

彼が使用しているPerlのバージョンでは、最後のスニペットは不必要にハッシュ全体を反復処理します。ちょうどfyi。 – ikegami

1

かどうかを確認するにはハッシュの要素を持って、あなただけのスカラコンテキストでそれを使用する:

scalar %h 

または

%h ? "yup" : "nope" 

scalar keys %h%hに鍵をカウントすることにより、同じ目的を達成、それはあなたが実際に知って欲しいものを求める方が良いでしょう。

いずれにしても、%hはハッシュであり、ハッシュリファレンスではありません。 (一部のバージョンのPerlでは、ハッシュリファレンスをkeysの引数として使用できますが、ハッシュリファレンスと評価される式EXPRが与えられた場合、対応するハッシュには%{ EXPR }と表示されます。 (! - > { 'のhref'}キー$自己){} `if文で_ref_が、それは`もしこれを実行することが可能ですハッシュされていない場合、あなたのサンプルコードと一緒にこれを置く、我々は

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
print "hash " . (%{ $self->{href} } ? "does" : "does not") . " contain elements\n"; 
関連する問題