|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
File::Find frage??
|
Seitenanfang |
weiss jemand warum da innerhalb der sub das system befehl fehlschlägt?? aber im normalen script ausserhalb funktionniert normal. das soll den ersten wert auffangen und im 2 script nochman ausgeben ganz einfach.
#!/usr/bin/perl use strict; use warnings; use File::Find; my $pfad = "C:/Documents and Settings/.."; find(\&Iss,$pfad); sub Iss{ # Für eine Suche nach Dateiendung .txt push my @ergebnis,$File::Find::name if $File::Find::name=~ /\.txt/; foreach my $text(@ergebnis){ print "$_\n"; system("perl datei2.pl $_"); } }
Datum: 27.11.2007-19:47

|
re: File::Find frage??
|
Seitenanfang |
| Wie äußert sich das Fehlschlagen von system()? Den Rueckgabewert pruefst du jedenfalls nicht. Noch ein kurzer Hinweis zur Funktionsweise von 'find', 'find' durchsucht die angegebenen Pfade und ruft fuer jede gefundene Datei bzw. gefundenen Ordner die angegebene Subroutine auf. Das bedeutet in deinen Fall, dass @ergebnis immer nur eine einzige Datei enthaelt. In der foreach-Schleife gehst du @ergebnis durch, $text bekommt (/bekaeme) den jeweiligen Wert zugewiesen, in den Schleifenblock verwendest du aber nicht $text sondern $_. Es ist zwar so dass $_ einen Wert hat, aber nicht den, den man vielleicht erwartet. $_ wird beim Aufruf der Subroutine auf den aktuellen Dateinamen oder den vollstaendigen Pfad gesetzt (abhaengig von der Option 'no_chdir').
Datum: 29.11.2007-04:33

|
re: File::Find frage??
|
Seitenanfang |
hi, der script findet schon die .txt datein(gibt den ganzen pfad zrk ) aber schafft s nicht mittel system()den 2ten script aufzurufen fehlmeldung: can´t open perl script"dateinsuche2.pl" no such file or directory. mit einfachen script in dem ich open readdir verwende und ein if anweisung benutze funktioniert prima. den system() aufruf. gruss
Datum: 29.11.2007-12:50

|
re: File::Find frage??
|
Seitenanfang |
Wie ich schon sagte, $_ enthaelt zu den Zeitpunkt nur den Dateinamen, $File::Find::name aber den (gesamten) absoluten Pfad. Da sich das Perlscript anscheinend nicht im selben Pfad befindet wie die *.txt-Dateien, koennen sie durch die Angaben eines relativen Pfades bzw. nur des Dateinamens nicht gefunden werden. Wenn du statt $_ also $File::Find::name im Aufruf von System verwendest, sollte es funktionieren.
Datum: 29.11.2007-15:47

|
re: File::Find frage??
|
Seitenanfang |
hoi nochmal, mit $_ tut s schon, enthält die .txt datein, ich lass es auch vorher augeben und tuts, aber danach wenn ich mittel system()das zweite script aufrufen möchte bricht s ab; es schafft nicht den zweitn script aufzurufen, verstehs was i meine? die beide scripte liegen in einem verz. system() problem, muss ja nur die variable als parameter mit übergeben. und das ist das zweite script
#!/usr/bin/perl use strict; my ($newabc) = @ARGV; # können auch mehrere sein print "in script 2\n"; print "var2: $newabc\n";
komisch??
Datum: 29.11.2007-16:37

|
re: File::Find frage??
|
Seitenanfang |
ich selbst hatte jetzt nicht aufgepasst, Fehlermeldung bezieht sich ja auf die Scriptdatei die nicht gefunden werden kann, nicht die txt-Datei. Trotzdem gilt die Verwendung eines absoluten Pfades als Problemloesung, wenn du das Script zum Bsp. durch einen Klick auf's Symbol vom Desktop aufrufst ist, ist dein Arbeitsverzeichnis ein anderes als das Verzeichnis in dem dein Script liegt. my $script_verz = 'C:/Verzeichnis/In/Dem/Beide/Scripte/Liegen/'; my $script_pfad = "$script_verz/dateinsuche2.pl";# oder besser use FindBin; my $script_pfad = "$FindBin::Bin/dateinsuche2.pl"; # und dann system("perl $script_pfad $_");
Datum: 29.11.2007-17:36

|
re: File::Find frage??
|
Seitenanfang |
du das habe ich auch probiert den absoluten pfad einzugeben, bleibt immer hängn, kann einfach den script nicht öffnen?? komischhhh
Datum: 29.11.2007-18:35

|
re: File::Find frage??
|
Seitenanfang |
| Dann versuch dein Problem zu replizieren, in dem du deine Scripte auf die Problemzeilen reduzierst, also zwei Minimalscripte schreibst. Datei: /tmp/first.pl
#!/usr/bin/perl $|++; use strict; use warnings; for my $count (1 .. 10) { print "$count\n"; sleep 1; }
Datei: $ENV{'HOME'}/second.pl
#!/usr/bin/perl use strict; use warnings; my $second_script = '/tmp/second.pl'; system("perl $second_script");
Wenn du first.pl in das Verzeichnis 'tmp' deiner Festplatte kopierst und second.pl in dein Benutzerverzeichnis und dann second.pl ausfuehrst, sollte die erwartete Ausgabe erscheinen.
Datum: 30.11.2007-02:33

|
re: File::Find frage??
|
Seitenanfang |
das problem habe ich schon gelöst das war im tread davor, guck mal 'Script-Frage' thread der ist auch aktuell,das ahbe ich für jemd geschrieben. und funktioniert auch prima.
#!/usr/bin/perl use warnings; use strict;my $pfad = "C:/Documents and Settings/XXX/"; opendir (DIR, "$pfad") || die "Can't open '$pfad': $!\n"; my @fileliste = readdir(DIR); closedir(DIR); foreach my $filename (@fileliste) { if ($filename =~ /\.txt/){ print $filename."\n"; system("perl dateinsuchen2.pl $filename"); }
aber nur wo ich s mit file::find lösen wollte war eben nix, weil damit auch die unterverzeichnisse suchen kannst, deswegen ja mal. aber echt merkwürdig dass die system() da nicht tut. ciao
Datum: 30.11.2007-03:04

|
re: File::Find frage??
|
Seitenanfang |
| Ich will mal den Thread nicht weiter in die Laenge ziehen, hier zwei Scripte die definitiv tun was sie sollen. Das zweite Script gibt einfach die Dateigroesze aus. Datei: C:/find_txt.pl
#!/usr/bin/perl use strict; use warnings; use File::Find; my $pfad = "C:/"; my @ergebnis; File::Find::find(\&lss, $pfad); foreach my $text (@ergebnis) { my $cmd = "perl C:/tmp/file_size.pl $text"; unless(system($cmd) == 0) { die "Error on executing '$cmd', return code: $?\n"; } } sub lss { push(@ergebnis, $File::Find::name) if $File::Find::name =~ /\.txt$/; }
Datei: C:/tmp/file_size.pl
#!/usr/bin/perl use strict; use warnings; print "Filesize: ", -s $ARGV[0], "\n";
Datum: 30.11.2007-21:58

|
|

|

|

|
 |

|

|
|