2013-01-11 8 views
7

Ilekroć pętlę przez hasz przez jego klucze, a następnie drukowanie każdej wartości, otrzymuję "wykorzystanie niezainicjowanej wartości w ostrzeżenie konkatenacji (.) Lub ciąg ...". Mimo że skrót jest wyraźnie inicjowany z góry. Wydruk, którego chcę, jest drukowany, ale nadal chciałbym wiedzieć, dlaczego powoduje to ostrzeżenie, zwłaszcza że dostęp do wartości bezpośrednio (poza pętlą) działa bez ostrzeżeń.Perl - Dlaczego zapętlenie hashu za pomocą kluczy, a następnie wydrukowanie każdej wartości powoduje niezainicjowane ostrzeżenie?

#!/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"; 
} 

Należy wziąć pod uwagę powyższy kod. Przypuszczam, że Perl dostrzega różnicę między pierwszym nadrukiem a drugim nadrukiem. Ale dlaczego? Dlaczego istnieje różnica między pobieraniem wartości skrótu poza pętlą a uzyskiwaniem wartości wewnątrz pętli?

Dzięki!

Odpowiedz

17

Użycie kontekstu mieszania w liście daje zarówno klucze, jak i wartości. Dlatego linia foreach my $key (%fruit) iteruje po kluczu, wartości, kluczu, wartości ...

To, czego potrzebujesz, to foreach my $key (keys %fruit).

+0

Dzięki! To naprawdę załatwiło sprawę. Nie zdawałem sobie sprawy :-). – Gx1sptDTDa

2

Użyj keys wewnątrz pętli . na przykład foreach my $key (keys %fruit) ...

2

Powinno być foreach my $key (keys %fruits). Myślę, że właśnie to chcesz zrobić.