2013-01-11 5 views
7

Ogni volta che eseguo il loop su un hash con le sue chiavi e quindi stampo ciascun valore, viene visualizzato un avviso "uso di valore non inizializzato in concatenazione (.) O stringa ...". Anche se l'hash è chiaramente inizializzato in anticipo. L'output che desidero viene stampato, ma mi piacerebbe comunque sapere perché questo si traduce in un avvertimento, soprattutto perché l'accesso a un valore direttamente (al di fuori di un ciclo) funziona senza avvisi.Perl - Perché il loop su un hash con le sue chiavi e quindi la stampa di ogni valore risulta in un avviso non inizializzato?

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

Prendere in considerazione il codice precedente. Immagino che perl veda una differenza tra la prima stampa e la seconda stampa. Ma perché? Perché c'è una differenza tra il recupero del valore di un hash al di fuori del ciclo e il recupero del valore di un has all'interno di un ciclo?

Grazie!

risposta

17

L'utilizzo di un hash nel contesto dell'elenco restituisce chiavi e valori. Pertanto la riga foreach my $key (%fruit) itera su chiave, valore, chiave, valore ...

Quello che ti serve è foreach my $key (keys %fruit).

+0

Grazie! Questo in effetti ha funzionato. Non ho realizzato :-). – Gx1sptDTDa

2

Utilizzare keys all'interno del ciclo for. per esempio. foreach my $key (keys %fruit) ...

2

Deve essere foreach my $key (keys %fruits). Penso che questo sia ciò che vuoi veramente fare.

Problemi correlati