each HASH
Quando viene chiamato in un contesto di lista, restituisce
una lista di due elementi che costituiscono la chiave
e il valore del prossimo elemento di un hash, in maniera
tale che possiate iterare su di esso. Quando viene
chiamato in un contesto scalare, restituisce soltanto
la chiave del prossimo elemento dell'hash.
Gli elementi vengono restituiti in un ordine
apparentemente casuale. L'effettivo ordine casuale
è soggetto a cambiamenti nelle future versioni
di Perl, ma è garantito essere lo stesso ordine
che la funzione keys o values produrrebbero dallo
stesso hash (non modificato). A partire dalla versione 5.8.1 di Perl,
per questioni di sicurezza l'ordinamento è differente anche tra
differenti esecuzioni di Perl (si consulti perlsec/"Algorithmic Complexity Attacks"
["Attacchi di Complessità Algoritmica", NdT]).
Quando l'hash è stato letto interamente,
in contesto di lista viene restituito un array null
(che quando viene assegnato produce un valore falso 0),
e undef in contesto scalare. La prossima chiamata a
each dopo questa comincerà l'iterazione
un'altra volta. Esiste un singolo iteratore per ogni
hash, condiviso da tutte le chiamate a each, keys
e values nel programma; può essere
azzerato leggendo tutti gli elementi dall'hash, oppure
valutando keys HASH o values HASH. Se aggiungete
o cancellate elementi a un hash mentre state iterando
su di esso, potreste avere degli elementi saltati
o ripetuti, quindi non fatelo. Eccezione: è sempre
sicuro cancellare l'elemento restituito più
di recente da each(), il che significa che il
seguente codice funzionerà:
while (($key, $value) = each %hash) {
print $key, "\n";
delete $hash{$key}; # E<egrave> sicuro
}
Il seguente codice stampa l'ambiente come il programma
printenv(1), con l'unica differenza che lo fa in
un'ordine differente:
while (($key,$value) = each %ENV) {
print "$key=$value\n";
}
Consultate anche keys, values e sort.