2012-02-21 8 views
10

スカラーコンテキストでPerlの配列を評価すると便利です。結果として#個の要素が得られます。スカラーコンテキストでPerlでハッシュを評価する理由は何ですか?

しかし、実際にスカラーコンテキストでハッシュを評価できるのは何ですか?例えば

  • my $scalar_value = %hash;

  • scalar(%hash)

私の知る限り理解し、それだけで有用であると思わハッシュの内部に関するいくつかの情報を与える「3/4」のような文字列を生成デバッグ用。

+0

違いは何ですか? –

+3

配列は '@' sigilを持つ変数です。リストはソースコード中の一連の項目です。このコードでは '@array =(1、2、3)'、 '(1,2,2)'はリスト、 '@ array'は配列変数です。 perlfaq4にはさらに詳しい情報が含まれています:http://perldoc.perl.org/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array? –

+1

しかし、スカラー(1,2,3,4)を書くことはできませんか?そうであれば "list"はあなたのステートメントに基づいて正しいのですか? –

答えて

14

ハッシュが空であるかどうかを知るためにTRUE/FALSEフラグとして使用できる値を生成します(キーはありません)。例として

if (%hash) { 
    print "Hash has elements\n"; 
} else { 
    print "Hash is empty\n"; 
} 

ifが理由ブール表現としてのその使用のスカラコンテキストへの発現を強制します。

それは空虚をテストするために、スカラコンテキストで@arrayを使用することに非常に似た概念です:

if (@array) { 
    # NOT empty! 
} 
+0

"空"は "キーがありません"を意味します。 – tchrist

+0

@tchrist - それを明確にすると付け加えましたが、他の "空のハッシュ"がどのように解釈されるかについて少し迷っています。 – DVK

+3

'%h =(foo => undef)'がスカラーとは違う何かを意味するかどうかは、人々が奇妙に変わってしまう原因です。 '@a =(undef)'で変わったのと同じです。有効な値はありませんが、それぞれに有効なインデックスが1つあります。それは重要なカウントです。 – tchrist

1

スカラー(%ハッシュは)ハッシュアルゴリズムが正しく動作しているかどうかをチェックすることができます。もしあなたが1000個の鍵を持っていて、2/16のようなものがあれば、すべての鍵は16個の割り当てられたバケツのうち2個だけに解決されます。これは、すべてのキーが非常によく似ていて、多くの衝突を引き起こし、バケット内で長いシーケンシャル検索が行われることを意味します。

デフォルトのバケット数は8

perl -le '$h{a}=1;print scalar %h' 
1/8 

Prestash 1000のバケット(2の最も近いパワーへ)

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h' 
1/1024 

これとハッシュはまた、あなたがPerlのOOのハッシュを祝福したときに出て役立ちます。 多くのキーがあることが分かっている場合は、スピードアップできます。

関連する問題