Tag opi.
Gibt es einen bestimmten Grund, weshalb while-Schleifen vorwiegend
für Filehandles und foreach-Schleifen für Arrays und Hashes (keys)
genutzt werden?
Ja, while-Schleifen durchlaufen eine Liste bis zum Erreichen der Abbruchbedingung. Das ist sinnvoll, wenn man entweder nicht weiß, welchen Umfang die zu durchlaufende Liste hat oder die zu durchlaufende Liste noch nicht gespeichert ist. Im Gegensatz dazu ist für die Anwendung von foreach eine existente Liste Voraussetzung. Bei Hashes beispielsweise kommt es darauf an, was du erreichen willst, denn generell hast du mit foreach eine bessere Kontrolle und kannst u.a. die keys alphabetisch sortieren:
foreach $schluessel (sort keys %werteliste) {
print "$wert ist $werteliste{$wert}";
}
Zu beachten ist, dass vor Ausführen der Schleife eine Liste der Schlüssel generiert wird, die natürlich Speicher kostet. Das kann bei großen Listen ein Nachteil sein. Weiterhin können Modifikationen innerhalb einer foreach-Schleife wegen der vor Ausführung erzeugten Schlüsselliste in die Hose gehen. Deshalb geht es auch so:
while (($schluessel, $wert) = each(%werteliste)) {
print "$schluessel ist $wert";
}
Die vorkonstruierte Liste ist auch der Grund, warum du beim Zugriff auf Filehandles keine foreach-Schleife verwenden kannst.
Siechfred