2012-02-25 17 views
44

次のコードを使用して、ハッシュが空であるかどうかを確認します。より良い方法があり、これは安全に使用できますか?perlでハッシュが空であるかどうかをチェックする方法

if (!keys %hash) { print "Empty";} 
+6

あなたの質問に答えられたと感じる場合は、その左側のチェックマークをクリックして回答を受け入れる必要があります。 – TLP

答えて

77
if (%hash) 

だけで正常に動作します。 perldoc perldataから

あなたはスカラーコンテキストでハッシュを評価する場合は、ハッシュ が空の場合、それはfalseを返します。キーと値のペアがある場合はtrueを返します。 more 正確には、返される値は、使用されたバケットの数が であり、割り当てられたバケットの数が のスラッシュで区切られた文字列です。

+2

'keys%hash'よりもずっと遅いようです。 – choroba

17

シンプル:

if (!%hash) { 
    print "Empty"; 
} 

!スカラーコンテキストを課し、スカラーコンテキストで評価ハッシュを返す:

  • falseをゼロキー(ドキュメントではなく、実験的に定義されていないが存在する場合割り当て/使用何を意味0

  • 文字列を返しますバケットは

+0

いいえ、true値である '' false "'は返されません。ゼロを返します。 – Borodin

+0

@Borodin - 引用符が間違っています。一定 – DVK

20

は常にfalseを返すようにスカラコンテキストで結ばれたハッシュを引き起こしa bugがあった(例えば「3/6」)もちろん、NOT falseになりますこれは、> 0のキーのために使用されています。バグはfixed in 5.8.5でした。下位互換性に懸念があるなら、遠くまで私はif(!keys %hash)に固執します。それ以外の場合はif(!%hash)を使用してください。

1

"Better"は主観的な用語です。しかし、わかりやすいコードは「より良い」と表現することができます。この理由から私は!keys %hashが良いと結論しています。なぜなら、誰もがperlコードを書いているので、このコードが何をしているのか知っているし、動作するからです。 !%hashは、実際に動作するかどうか、または動作するかどうかを確認するために最低限必要なものです。スカラーコンテキストでの配列の振る舞いはよく知られておりよく使われるが、スカラーコンテキストでのハッシュの戻り値はむしろ混乱し、よく使われる理由がある。

また、!keys %hashは保存される。

いいえ、ハッシュが空であるかどうかを確認する方法はありません。

関連する問題