Mir fällt da noch was auf.
Falls das if nicht zutrifft, d.h. die Zeile passt nicht, sollte ja eigentlich weitergesucht werden.
Wenn der else-Zweig ausgeführt wird, wird $weiter auf false gesetzt und somit die Schleife beendet.
Das heißt, weitere Zeilen außer der ersten werden gar nicht durchsucht.
Da stimmt noch was mit der Logik nicht.