web-dev-qa-db-ja.com

perlでハッシュが空かどうかを確認する方法

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

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

うまく動作します。

perldoc perldata から:

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

86
TLP

バグ があったため、スカラーコンテキストでタイハッシュが常にfalseを返していました。バグは 5.8.5で修正済み でした。後方互換性に関心がある場合は、if( !keys %hash )を使用します。それ以外の場合は、他の人が推奨するif( !%hash )を使用します。

22
Schwern

より簡単:

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

!スカラーコンテキストを課し、スカラーコンテキストで評価されたハッシュは以下を返します。

  • falseキーがない場合(ドキュメントで定義されていませんが、実験的に0

  • > 0キーに使用/割り当てられたバケットの数を示す文字列。これはもちろんfalseではありません(例:「3/6」)

19
DVK

「より良い」は主観的な用語です。ただし、理解しやすいコードは「より良い」と表現できると主張します。このため、!keys %hashの方が優れています。Perlコードを記述するすべての人が、このコードの機能と動作を知っているからです。 !%hashは、少なくとも実際に動作するのか、動作するように見えるだけなのかを確認するために調べなければならないものです。 (その理由は、スカラーコンテキストでのハッシュの戻り値がかなりわかりにくいのに対し、スカラーコンテキストでの配列の動作はよく知られており、よく使用されているためです。)

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

そのため、ハッシュが空かどうかを確認するより良い方法や節約方法はありません。

2
Benjamin Krupp