Als Faustregel gilt, die Funktion zu verwenden, die Ihren Anforderungen am besten entspricht.
Wenn Sie nur die Schlüssel möchten und nicht vorhaben, jemals einen der Werte zu lesen , verwenden Sie keys ():
foreach my $key (keys %hash) { ... }
Wenn Sie nur die Werte möchten, verwenden Sie values ():
foreach my $val (values %hash) { ... }
Wenn Sie die Schlüssel und Werte benötigen , verwenden Sie each ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Wenn Sie vorhaben, die Schlüssel des Hashs in irgendeiner Weise zu ändern, außer den aktuellen Schlüssel während der Iteration zu löschen, dürfen Sie nicht jeden () verwenden. Dieser Code zum Erstellen eines neuen Satzes von Großbuchstaben mit doppelten Werten funktioniert beispielsweise mit keys ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
Erzeugen des erwarteten resultierenden Hash:
(a => 1, A => 2, b => 2, B => 4)
Aber mit jedem () das Gleiche tun:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
führt auf schwer vorhersehbare Weise zu falschen Ergebnissen. Beispielsweise:
(a => 1, A => 2, b => 2, B => 8)
Dies ist jedoch sicher:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
All dies ist in der Perl-Dokumentation beschrieben:
% perldoc -f keys
% perldoc -f each