Hallo, Irgendwie will meine if (-e ...) Schleife nicht. Er springt immer in das ELSE ! Die Dateien, die in $batchfile aufgelistet sind existieren im Verzeichnis $indir. Wenn ich statt $job direkt den Dateinamen angebe geht es. Es geht auch, wenn ich hart sage $job = "Dateiname.Endung"; Es will nur nicht, wenn er den Inhalt von $job aus der $batchfile lesen soll. Was mach ich falsch !?!?! --------- #!/usr/bin/perl $indir = "/scripts/files/"; $batchfile = "/scripts/input/job"; use File::Path; use File::Copy; chdir ("$indir"); @input=`cat $batchfile`; foreach $job (@input) { if (-e $job) { print $file; print "OK\n"; } else { print "noe\n"; } } --------- -- MfG Yann Wissenbach - Administration/Support compass Gesellschaft fuer Medientechnologie mbH Robert-Koch-Str. 35 D-55129 Mainz mail: y.wissenbach@compass-online.de www : http://www.compass-online.de fon : +49 6131 90 63 - 121 fax : +49 6131 90 63 - 222
Hallo, On Monday 05 July 2004 12:44, Yann Wissenbach wrote:
Hallo,
Irgendwie will meine if (-e ...) Schleife nicht. Er springt immer in das ELSE ! Die Dateien, die in $batchfile aufgelistet sind existieren im Verzeichnis $indir.
Wenn ich statt $job direkt den Dateinamen angebe geht es. Es geht auch, wenn ich hart sage $job = "Dateiname.Endung";
Es will nur nicht, wenn er den Inhalt von $job aus der $batchfile lesen soll.
Was mach ich falsch !?!?!
--------- #!/usr/bin/perl $indir = "/scripts/files/"; $batchfile = "/scripts/input/job";
use strict; use warning;
use File::Path; use File::Copy;
chdir ("$indir"); @input=`cat $batchfile`;
Wozu cat? Warum nicht die Funktion open?
foreach $job (@input) {
#Damit es klappt: chomp($job); #Wenn es Windowsdateien sind, #dos2unix drüber laufen lassen #oder nochmal chomp
if (-e $job) { print $file; print "OK\n"; } else { print "noe\n"; } }
$job hat nämlich immer noch einen Zeilenumbruch an sich dranhängen. Den sollte man entfernen. Ferdinand
At 13:05 05.07.2004, Ferdinand Ihringer wrote:
#Damit es klappt: chomp($job); #Wenn es Windowsdateien sind, #dos2unix drüber laufen lassen #oder nochmal chomp
Das braucht's nicht. Perl kennt Windows-Zeilenumbrüche. Gruß, Koczian Dr. Sibylle Koczian Universitaetsbibliothek, Abt. Naturwiss. D-86135 Augsburg Tel.: (0821) 598-2400, Fax : (0821) 598-2410 e-mail : Sibylle.Koczian@Bibliothek.Uni-Augsburg.DE
Hallo, On Tuesday 06 July 2004 14:49, Sibylle Koczian wrote:
At 13:05 05.07.2004, Ferdinand Ihringer wrote:
#Damit es klappt: chomp($job); #Wenn es Windowsdateien sind, #dos2unix drüber laufen lassen #oder nochmal chomp
Das braucht's nicht. Perl kennt Windows-Zeilenumbrüche.
Aber die haben zwei Zeichen. Und chomp macht da IIRC keinen Unterschied zwischen den Steuerzeichen. Ferdinand
At 17:19 06.07.2004, Ferdinand Ihringer wrote:
Hallo,
On Tuesday 06 July 2004 14:49, Sibylle Koczian wrote:
At 13:05 05.07.2004, Ferdinand Ihringer wrote:
#Damit es klappt: chomp($job); #Wenn es Windowsdateien sind, #dos2unix drüber laufen lassen #oder nochmal chomp
Das braucht's nicht. Perl kennt Windows-Zeilenumbrüche.
Aber die haben zwei Zeichen. Und chomp macht da IIRC keinen Unterschied zwischen den Steuerzeichen.
Unter Windows verschwinden die Zeilenumbrüche komplett, mit einem chomp-Aufruf. Aber wahrscheinlich hast Du etwas anderes gemeint: eine Datei mit Windows-Zeilenumbrüchen unter Linux verarbeiten. Was chomp da tut, habe ich tatsächlich noch nicht ausprobiert (aber sofort auf die Liste gesetzt). Gruß, Koczian Dr. Sibylle Koczian Universitaetsbibliothek, Abt. Naturwiss. D-86135 Augsburg Tel.: (0821) 598-2400, Fax : (0821) 598-2410 e-mail : Sibylle.Koczian@Bibliothek.Uni-Augsburg.DE
Hallo, On Wednesday 07 July 2004 10:30, Sibylle Koczian wrote:
At 17:19 06.07.2004, Ferdinand Ihringer wrote:
Hallo,
On Tuesday 06 July 2004 14:49, Sibylle Koczian wrote:
At 13:05 05.07.2004, Ferdinand Ihringer wrote:
#Damit es klappt: chomp($job); #Wenn es Windowsdateien sind, #dos2unix drüber laufen lassen #oder nochmal chomp
Das braucht's nicht. Perl kennt Windows-Zeilenumbrüche.
Aber die haben zwei Zeichen. Und chomp macht da IIRC keinen Unterschied zwischen den Steuerzeichen.
Unter Windows verschwinden die Zeilenumbrüche komplett, mit einem chomp-Aufruf. Aber wahrscheinlich hast Du etwas anderes gemeint: eine Datei mit Windows-Zeilenumbrüchen unter Linux verarbeiten. Was chomp da tut, habe ich tatsächlich noch nicht ausprobiert (aber sofort auf die Liste gesetzt).
Ich benutze selten Windows und damit dort auch selten Perl. Außerdem lässt man unter Windows für Perl kein dos2unix drüber laufen. Und diese Liste heißt suse-linux und nicht suse-windows. Daher dachte ich, das wäre klar. Ferdinand
At 16:13 07.07.2004, Ferdinand Ihringer wrote:
Hallo,
On Wednesday 07 July 2004 10:30, Sibylle Koczian wrote:
At 17:19 06.07.2004, Ferdinand Ihringer wrote:
Hallo,
On Tuesday 06 July 2004 14:49, Sibylle Koczian wrote:
At 13:05 05.07.2004, Ferdinand Ihringer wrote:
#Damit es klappt: chomp($job); #Wenn es Windowsdateien sind, #dos2unix drüber laufen lassen #oder nochmal chomp
Das braucht's nicht. Perl kennt Windows-Zeilenumbrüche.
Aber die haben zwei Zeichen. Und chomp macht da IIRC keinen Unterschied zwischen den Steuerzeichen.
Unter Windows verschwinden die Zeilenumbrüche komplett, mit einem chomp-Aufruf. Aber wahrscheinlich hast Du etwas anderes gemeint: eine Datei mit Windows-Zeilenumbrüchen unter Linux verarbeiten. Was chomp da tut, habe ich tatsächlich noch nicht ausprobiert (aber sofort auf die Liste gesetzt).
Ich benutze selten Windows und damit dort auch selten Perl. Außerdem lässt man unter Windows für Perl kein dos2unix drüber laufen. Und diese Liste heißt suse-linux und nicht suse-windows. Daher dachte ich, das wäre klar.
Und ich bin einfach davon ausgegangen, dass eine Windows-Datei unter Windows benutzt wird. Moral: Annahmen sind meistens falsch. Jetzt habe ich mal alle vier Varianten durchprobiert und die Ergebnisse sind so, wie man es eigentlich auch erwarten sollte: a) Datei mit Unix-Zeilenumbruch (LF allein): chomp entfernt den Zeilenumbruch (und sonst nichts) unter Linux und unter Windows - klar, denn auch unter Windows ist ein LF zumindest ein halber Zeilenumbruch. b) Datei mit Windows-Zeilenumbruch (CR LF): chomp entfernt unter Windows den ganzen Zeilenumbruch (gibt aber 1 zurück, obwohl es ja eigentlich 2 Zeichen sind), unter Linux nur das LF, CR bleibt stehen. Ein zweites chomp, wie oben als Alternative vorgeschlagen, entfernt dann gar nichts mehr. Auch klar, denn CR hat unter Linux mit einem Zeilenumbruch nichts zu tun. Gruß, Koczian Dr. Sibylle Koczian Universitaetsbibliothek, Abt. Naturwiss. D-86135 Augsburg Tel.: (0821) 598-2400, Fax : (0821) 598-2410 e-mail : Sibylle.Koczian@Bibliothek.Uni-Augsburg.DE
Hallo, On Friday 09 July 2004 10:12, Sibylle Koczian wrote: ...
b) Datei mit Windows-Zeilenumbruch (CR LF): chomp entfernt unter Windows den ganzen Zeilenumbruch (gibt aber 1 zurück, obwohl es ja eigentlich 2 Zeichen sind), unter Linux nur das LF, CR bleibt stehen. Ein zweites chomp, wie oben als Alternative vorgeschlagen, entfernt dann gar nichts mehr. Auch klar, denn CR hat unter Linux mit einem Zeilenumbruch nichts zu tun.
Ja, schrieb schon Jan. chomp hatte ich falsch (mit irgendwas allgemeinerem als Zeilenumbrüchen) im Kopf. Nachsehen wäre besser gewesen. :-| Ferdinand
Am Mittwoch, 7. Juli 2004 10:30 schrieb Sibylle Koczian:
At 17:19 06.07.2004, Ferdinand Ihringer wrote:
On Tuesday 06 July 2004 14:49, Sibylle Koczian wrote: [chomp]
Das braucht's nicht. Perl kennt Windows-Zeilenumbrüche.
Aber die haben zwei Zeichen. Und chomp macht da IIRC keinen Unterschied zwischen den Steuerzeichen.
Unter Windows verschwinden die Zeilenumbrüche komplett, mit einem chomp-Aufruf. Aber wahrscheinlich hast Du etwas anderes gemeint: eine Datei mit Windows-Zeilenumbrüchen unter Linux verarbeiten. Was chomp da tut, habe ich tatsächlich noch nicht ausprobiert (aber sofort auf die Liste gesetzt). [...]
Hm, wie wäre es statt Probieren mit einem forschen: perldoc -f chomp [...] chomp VARIABLE chomp( LIST ) chomp This safer version of "chop" removes any trailing string that corresponds to the current value of $/ (also known as $INPUT_RECORD_SEPARATOR in the "English" module). It returns the total number of [...] Da stehts: chomp entfernt die in $/ definierten Satztrenner. Das kann natürlich nur dann sauber funktionieren, wenn eine Datei auf dem OS bearbeitet wird, auf dem sie erzeugt wurde. Eine unter Windows generierte Datei hat \r\n am Zeilenende, ein perl unter Unix würde nur \n entfernen - es sei denn, man definiert $/ um. Wenn man weiss, woher die Dateien kommen, dann geht z. B. auch: s/\r\n$//; Jan
Am Mittwoch, 7. Juli 2004 19:28 schrieb Jan Trippler: [...]
Wenn man weiss, woher die Dateien kommen, dann geht z. B. auch: s/\r\n$//;
P.S.: Wenn man es nicht weiss, dann sollte s/\r?\n$//; funktionieren. Und mit s/\r?\n?$//; oder s//[\r\n]{1,2}$// gehts sogar mit MAC-Dateien (nur \r am Ende AFAIK). Jan
Hallo, Yann Wissenbach schrieb:
Hallo,
Irgendwie will meine if (-e ...) Schleife nicht. Er springt immer in das ELSE ! [...] --------- #!/usr/bin/perl $indir = "/scripts/files/"; $batchfile = "/scripts/input/job";
use File::Path; use File::Copy;
chdir ("$indir"); @input=`cat $batchfile`; foreach $job (@input) { if (-e $job) { Folgendes zur vorangegangenen Zeile: if(-e "$job") { wäre besser. Außerdem steht in $job jetzt folgendes: "das_ist_der_dateiname.endung\n".
Wende vorher mal ein chomp auf $job an: chomp($job); if(-e "$job") {
print $file; print "OK\n"; } else { print "noe\n"; } } ---------
Ich hoffe, dass es an einem dieser "Fehler" liegt. Zu chomp siehe auch: http://de.selfhtml.org/cgiperl/funktionen/zeichenketten.htm#chomp Sven
participants (6)
-
Ferdinand Ihringer
-
Heinz Diehl
-
Jan.Trippler@t-online.de
-
Sibylle Koczian
-
Sven Niese
-
Yann Wissenbach