Um eine Eingabedatei durch eine modifizierte Version zu ersetzen bietet es sich an, zunächst eine temporäre Datei zu schreiben und diese dann in die ursprüngliche Eingabedatei umzubenennen. Diese Lösung hat den Vorteil, dass das Umbenennen als letzter Schritt im Programm passieren kann und die ursprüngliche Eingabe nicht beschädigt wird, wenn irgendwo während der Bearbeitung im Skript ein Fehler auftritt.
Zum Erzeugen einer temporären Datei empfiehlt sich das Modul
File::Temp. Man sollte ferner darauf achten, dass diese Datei im gleichen Verzeichnis wie die zu überschreibende Datei angelegt wird, damit das Umbenennen garantiert eine atomare Operation bleibt.
Weitere Anmerkungen zu Deinem Code:
- use strict; und use warnings; sollten in keinem guten Skript fehlen.
- Auch beim Öffnen einer Ausgabedatei können Fehler auftreten, die man abfangen sollte.
- Die Verwendung lexikalischer Filehandles wäre eine gute Idee.
- Die dreiargumentige Form von open ist weniger fehleranfällig als die zweiargumentige.
- Statt überflüssige Variablen mit Dateinamen zu belegen, die unmittelbar danach in Aufrufen von open verwendet werden aber sonst nirgends, würde ich diese Zeichenketten am Anfang des Programmes als Konstanten deklarieren, dann erhöht sich wenigstens die Lesbarkeit des Programmes.
- Die Variable $i scheint vollkommen überflüssig zu sein und lediglich der Verschleierung des Codes zu dienen.
- Die Variable @array enthält offenbar niemals mehr als ein einziges Element. Es stellt sich die Frage, warum trotzdem ein Array verwendet wird.
- Die Verwendung der Variablen $flag erscheint unübersichtlich und lässt sich vermutlich elegant durch Einsatz des Flipflopoperators ... ersetzen.
When C++ is your hammer, every problem looks like your thumb.