2013-01-11 5 views
7

キーでハッシュをループし、各値を出力するたびに、「連結(。)または文字列...で初期化されていない値を使用する」という警告が表示されます。ハッシュは明確に初期化されていますが。私が望む出力が表示されますが、特にループには直接値にアクセスすると警告なしで動作するため、この結果が警告になる理由を知りたいと思います。Perl - キーでハッシュをループして、各値を出力すると、初期化されない警告が表示されるのはなぜですか?

#!/usr/bin/perl 
use warnings; 
use strict; 

my %fruit =(); 
%fruit = ('Apple' => 'Green', 'Strawberry' => 'Red', 'Mango' => 'Yellow'); 

#works 
print "An apple is $fruit{Apple} \n"; 

#gives warnings 
foreach my $key (%fruit) 
{ 
    print "The color of $key is $fruit{$key} \n"; 
} 

#also gives warnings 
foreach my $key (%fruit) 
{ 
    my $value = $fruit{$key}; 
    print "$value \n"; 
} 

上記のコードを検討してください。私は、最初の印刷物と2番目の印刷物との間に違いがあると思います。しかし、なぜ?ループ外のハッシュの値を取得することと、ループの内部にあるハッシュの値を取り出すこととの違いは何ですか?

ありがとうございます!

答えて

17

リストコンテキストでハッシュを使用すると、キーと値の両方が得られます。したがって、foreach my $key (%fruit)行は、キー、値、キー、値を繰り返し処理します。

必要なものはforeach my $key (keys %fruit)です。

+0

ありがとうございます!これは本当にトリックでした。気づかなかった:-)。 – Gx1sptDTDa

2

forループ内にkeysを使用してください。例えばforeach my $key (keys %fruit) ...

2

foreach my $key (keys %fruits)である必要があります。私はこれがあなたが実際にやりたいことだと思います。

関連する問題