2010-12-09 10 views

Antwort

7

(Dies ist die official perlfaq answer, abzüglich aller nachfolgenden Änderungen)

Es gibt ein paar Möglichkeiten, wie Sie einen ganzen Hash verarbeiten kann. Sie können eine Liste von keys abrufen, dann gehen Sie durch jede Taste, oder greifen Sie ein Schlüssel-Wert-Paar auf einmal.

Um alle Tasten zu durchlaufen, verwenden Sie die keys function. Dies extrahiert alle Schlüssel des Hash und gibt sie Ihnen als Liste zurück. Sie können dann den Wert durch den bestimmten Schlüssel erhalten Sie die Bearbeitung:

foreach my $key (keys %hash) { 
    my $value = $hash{$key} 
    ... 
    } 

Sobald Sie die Liste der Schlüssel haben, können Sie diese Liste bearbeiten, bevor Sie die Hash-Elemente verarbeiten. Zum Beispiel können Sie die Schlüssel sortieren, damit Sie sie in lexikalischer Reihenfolge verarbeiten kann:

foreach my $key (sort keys %hash) { 
    my $value = $hash{$key} 
    ... 
    } 

Oder möchten Sie vielleicht nur einige der Elemente verarbeiten. Wenn Sie nur mit dem Schlüssel beschäftigen möchten, die mit dem Text beginnen :, können Sie nur diejenigen mit grep wählen:

foreach my $key (grep /^text:/, keys %hash) { 
    my $value = $hash{$key} 
    ... 
    } 

Wenn der Hash sehr groß ist, können Sie nicht eine lange Liste der Schlüssel zu erstellen. Um etwas Speicherplatz zu sparen, können Sie ein Schlüssel-Wert-Paar in einer Zeit greifen each() verwenden, die ein Paar kehrt noch nicht gesehen haben:

while(my($key, $value) = each(%hash)) { 
    ... 
    } 

Der jeder Operator gibt die Paare in scheinbar zufälliger Reihenfolge, so dass, wenn Dinge zu ordnen, müssen Sie bei der Schlüsselmethode bleiben.

Der Operator each() kann jedoch ein bisschen schwierig sein. Sie können Keys des Hashs nicht hinzufügen oder löschen, während Sie es verwenden, ohne einige Paare zu überspringen oder neu zu verarbeiten, nachdem Perl alle Elemente intern neu erstellt hat. Darüber hinaus verfügt ein Hash nur über einen Iterator. Wenn Sie also keys, values oder each für denselben Hash verwenden, können Sie den Iterator zurücksetzen und Ihre Verarbeitung beeinträchtigen. Weitere Informationen finden Sie unter each entry in perlfunc.