Zweiter foreach-loop der @ARGV verwendet funktioniert nicht: $_ used unitialized

14/03/2008 - 09:12 von Oliver Abram | Report spam
Hallo,

ich habe hier ein kleines Problem das den unten stehenden Sourcecode
betrifft. Habe ein Script geschrieben das zwei foreach-loops enthàlt.
Beide verwenden @ARGV. Das Programm wird z.B. so aufgerufen:
""copyright.pl text1.txt text2.txt text3.txt"

Die erste Schleife erzeugt .bak Dateien von den Dateien die beim Aufruf
übergeben wurden. Ich weiß dass es auch andere Wege gibt, das zu tun,
aber ich möchte es in diesem Fall genau so machen.

Die zweite Schleife liest den Inhalt der erstellten .bak Dateien und
soll die originalen überschreiben.

Aber unter anderem meckert Perl, "the value $_ is used unitialized in
the first line of the second foreach-loop".

Bin dankbar für Hilfe,

Oliver





########################################################################
#!perl
use warnings;
use diagnostics;
use strict;

foreach (@ARGV)
{
open READ_FILE, "<$_"; #opens the input file for reading
open WRITE_FILE, ">$_.bak"; #open a file for backup purposes
while(<READ_FILE>) #creates .bak files for every file with
#which the script got called
{
print WRITE_FILE $_;
}
close READ_FILE;
close WRITE_FILE;
}

foreach (@ARGV)
{
open READ_BACKUPED_FILE, "<$_.bak"; #now it will be read from the
backup files
open WRITE_COPYRIGHT_FILE, ">$_"; #the original files will be
overwritten
print WRITE_COPYRIGHT_FILE "##Copyright (C) 2008 by Me myself and
Irene";
while (<READ_BACKUPED_FILE>)
{
print WRITE_COPYRIGHT_FILE $_;
}
close READ_FILE;
close WRITE_COPYRIGHT_FILE;
}
########################################################################
 

Lesen sie die antworten

#1 Tim Landscheidt
14/03/2008 - 10:51 | Warnen spam
Oliver Abram wrote:

[...]
Die erste Schleife erzeugt .bak Dateien von den Dateien die
beim Aufruf übergeben wurden. Ich weiß dass es auch andere
Wege gibt, das zu tun, aber ich möchte es in diesem Fall
genau so machen.
[...]



Ich halte mir einmal die Ohren zu und sage leise:

| perl -p -0777 -i.bak -e 's/^/##Copyright (C) 2008 by Me myself and Irene/;' *.txt

Dass Dein Programm nicht funktioniert, liegt daran, dass die
foreach-Schleife $_ auf das jeweilige Listelement verweisen
làsst, also keine lokale Kopie erzeugt. In der Kopierschlei-
fe wird dann $_ an dem Dateiende auf undefined gesetzt, so
dass @ARGV nach der ersten foreach-Schleife aus einer Reihe
von undefined-Werten besteht. Wenn Du Konstrukte der Art
"foreach my $filename (@ARGV)" benutztest, sollte der Fehler
verschwinden.

BTW, an Stellen wie:

| open WRITE_FILE, ">$_.bak"; #open a file for backup purposes

solltest Du auf den Erfolg prüfen ("or die ...").

Tim

Ähnliche fragen