Meine Vermutung ist: foreach setzt $_ auf eine Referenz auf das jeweilige Array-Element.
Anschließend setzt die while-Schleife $_ jeweils auf die Zeile, die gelesen wird. Wenn es keine weiteren Zeilen mehr gibt, gibt <OEFFNEN> undef zurück, und darauf wird dann auch $_ gesetzt, was sich wiederum auf das Array-Element auswirkt.
Wenn Du genau hinschaust, siehst Du auch, dass dein Array nicht leer ist, sondern anstelle der Dateinamen mehrere Leerzeichen kommen: mehrere undefinierte Elemente, getrennt durch Leerzeichen.
Lösen kannst Du es auf verschiedene Arten:
die while-Schleife
while (my $tmp = <OEFFNEN>) {
push @zeilen, $tmp;
}
in diese Art zu ändern, sollte helfen.
Grundsätzlich finde ich es immer hilfreich, nicht $_ zu nutzen. Einerseits wegen manchen Merkwürdigkeiten wie Du sie gerade hast, aber auch weil ich explizite Dinge im Code mag, die jedem sofort sagen, was hier passiert und was in welcher Variablen gerade steckt. Ergo würde ich das auch mit
for my $datei (@dateien){
schreiben.
Zum ausgeben vom Variableninhalt empfehle ich dir
Data::Dump's pp anstatt sie einfach in einen string zu packen.
Oben:
und unten dann
Das gibt bei mir im "Problemfall"
und mit dem obigen Fix dann
.