2016-08-11 4 views
3

これら2つのハッシュ初期化メソッドの違いは何ですか?Perlのハッシュペアの印刷

第一の方法:

$items{"food"} = "4.4"; 
$items{"water"} = "5.0"; 
$items{"shelter"} = "1.1"; 

foreach $item (keys $items) { 
    print "$item\n"; 
} 

出力である:

food 
water 
shelter 

第2の方法:

%items = { 
    'food' => '4.4', 
    'water' => '5.0', 
    'shelter' => '1.1' 
}; 

foreach $item (keys %items) { 
    print "$item\n"; 
} 

出力は、ハッシュリファレンスである:

HASH(0x8cc41bc) 

なぜ第二の方法ではなく、実際の値の参照を返すでしょうか?

+1

2番目のケースでは、「%hash」に対する匿名ハッシュへの単一の参照を割り当てました。したがって、ハッシュリファレンスの文字列化とそれに対応する 'undef'値のキーは1つだけです。投票を終了する。 –

+0

Sinanさん、ありがとうございました.2番目のインスタンスを修正するにはどうすればよいですか? – Brite

+3

'my%h =(...)'のように、キーの値のペアのリストを割り当てるか、スカラー、つまり 'my $ h = {...}'に割り当てる必要があります。後者の場合は 'keys%$ h'を使います。 –

答えて

8

{}は何を誤解しているのでしょうか?

匿名ハッシュを作成して参照を返します。多くの意味がありません

my %stuff = (
    'food' => '4.4', 
    'water' => '5.0', 
    'shelter' => '1.1' 
); 


my %items = \%stuff; 

:あなただけやった

は、機能的に類似しています。

()を使用してハッシュを初期化しても問題ありません。

2

これは、常にのPerlコードの警告をオンにするべき理由の良い例です。

$ perl -Mwarnings -E'%h = {}; say keys %h' 
Reference found where even-sized list expected at -e line 1. 
HASH(0xbb6d48) 

詳細については、「診断」も使用してください。

$ perl -Mwarnings -Mdiagnostics -E'%h = {}; say keys %h' 
Reference found where even-sized list expected at -e line 1 (#1) 
    (W misc) You gave a single reference where Perl was expecting a list 
    with an even number of elements (for assignment to a hash). This usually 
    means that you used the anon hash constructor when you meant to use 
    parens. In any case, a hash requires key/value pairs. 

     %hash = { one => 1, two => 2, };  # WRONG 
     %hash = [ qw/ an anon array/];  # WRONG 
     %hash = (one => 1, two => 2,);  # right 
     %hash = qw(one 1 two 2);    # also fine 

HASH(0x253ad48)