perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 25
Click for quality!




10.02.2012 / 19:58

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragFile::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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

-






-
-