iterieren Mein Problem ist einfach. Ich muss einige Schlüssel-Wert-Paare aus einem Hash drucken. Ich habe versucht, zwei verschiedene Methoden:Verschiedene Ergebnisse über einen Hash in Perl
METHODE A
#Fill hash from file ($fh has been defined previously)
while(my $line = <$fh>) {
$counter{$line}++;
}
foreach (my($k, $v) = each %counter){
my ($p1, $p2) = split(/$;/o, $k);
chomp $p2;
if($v > 0){
printf "%s_down_%s %s %d\n", $prefix, $p1, $p2, $v;
printf "%s_up_%s %s %d\n", $prefix, $p2, $p1, $v;
}
}
VERFAHREN B
#Fill hash from file ($fh has been defined previously)
while(my $line = <$fh>) {
$counter{$line}++;
}
foreach $k (keys %counter) {
my ($p1, $p2) = split(/$;/o, $k);
my $v = $counter{$p1,$p2};
chomp $p2;
if($v > 0){
printf "%s_down_%s %s %d\n", $prefix, $p1, $p2, $v;
printf "%s_up_%s %s %d\n", $prefix, $p2, $p1, $v;
}
}
den Code lesen, ich würde sagen, beide Methoden das gleiche Ergebnis zu erhalten, aber, nach der Ausführung es, Methode B, bekam die richtigen Ergebnisse und Methode A gedruckt nur zwei Elemente (4 Zeilen).
Nachdem ich die Methode A mehrmals ausgeführt habe, kann ich sehen, dass die gedruckten Elemente jede Ausführung ändern.
Jeder weiß, was hier vor sich geht?
@ IvánRodríguezTorres die Antwort aktualisiert, die beide durch das erste Beispiel der Bearbeitung und die Erklärung und das Hinzufügen von einem besseres Beispiel. Das Fazit ist natürlich das gleiche: 'for' ist falsch und man muss' while' verwenden. Aber um das Verhalten zu erklären, wenn 'for' verwendet wird, gibt es eine ganze Menge mehr. Danke für die Zuschreibung. – zdim
Ihre Antwort ist sehr klar, wie immer. Vielen Dank. –
@ IvánRodríguezTorres Froh, dass es geholfen hat und danke, dass Sie das gesagt haben. Es ist eine Freude, mit dir zu interagieren :) – zdim