File::Find, Variablen an "wanted" übergeben?
File::Find, Variablen an "wanted" übergeben?
am 23.03.2006 19:57:50 von Torsten Mohr
Hallo,
das Modul File::Find ist sehr hilfreich.
Allerdings vermisse ich die Möglichkeit, zusätzliche Daten an
die aufgerufene Funktion 'wanted' zu übergeben.  Falls diese
Funktion noch weitere Parameter benötigt (z.B. einen Filter-String),
dann kann ich den nur als globale Variable angeben.
Oder habe ich da was übersehen?
GrüÃe,
Torsten.
Re: File::Find, Variablen an "wanted" übergeben?
am 23.03.2006 22:35:56 von Lukas Mai
Torsten Mohr schrob:
> Hallo,
>
> das Modul File::Find ist sehr hilfreich.
>
> Allerdings vermisse ich die Möglichkeit, zusätzliche Daten an
> die aufgerufene Funktion 'wanted' zu übergeben. Falls diese
> Funktion noch weitere Parameter benötigt (z.B. einen Filter-String),
> dann kann ich den nur als globale Variable angeben.
>
> Oder habe ich da was übersehen?
Ja, Closures.
find(
sub {
eigentliche_funktion("filter-string", @etc);
},
@dirs
);
Du kannst einfach temporäre Funktionen "on the fly" definieren, die dann
die eigentliche Funktion mit beliebigen Argumenten aufrufen. Oder du
verzichtest auf eigentliche_funktion() und packst den ganzen Code in
sub { ... }.
Jedenfalls haben solche Funktionen Zugriff auf äußere lokale Variablen,
und das ist eigentlich alles, was du brauchst.
HTH, Lukas
Re: File::Find, Variablen an "wanted"übergeben?
am 23.03.2006 22:42:13 von Christian Lackas
* Torsten Mohr [2006-03-23]:
Hallo Torsten,
> das Modul File::Find ist sehr hilfreich.
> Allerdings vermisse ich die Möglichkeit, zusätzliche Daten an
> die aufgerufene Funktion 'wanted' zu übergeben. Falls diese
> Funktion noch weitere Parameter benötigt (z.B. einen Filter-String),
> dann kann ich den nur als globale Variable angeben.
du kannst ein Closure verwenden, also z.B. sowas:
use strict;
use File::Find;
sub gen_wanted {
my $param = shift;
sub {
return unless /$param/;
print
}
}
find( gen_wanted('^j'), '/tmp/' );
Damit erzeugst du dir dann wanted-Funktionen je nach Bedarf und kannst
bei der Erzeugung auch Parameter mitgeben, die später benutzt werden und
die nur innerhalb des Closure sichtbar sind.
Gruß
Christian
--
Wer in sich geht, sollte nicht erschrecken, wenn er niemanden antrifft.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: File::Find, Variablen an "wanted" übergeben?
am 24.03.2006 02:43:50 von Torsten Mohr
Hallo,
> du kannst ein Closure verwenden, also z.B. sowas:
>
> use strict;
> use File::Find;
> sub gen_wanted {
> my $param = shift;
> sub {
> return unless /$param/;
> print
> }
> }
> find( gen_wanted('^j'), '/tmp/' );
>
> Damit erzeugst du dir dann wanted-Funktionen je nach Bedarf und kannst
> bei der Erzeugung auch Parameter mitgeben, die später benutzt werden und
> die nur innerhalb des Closure sichtbar sind.
danke für den Tip. Ja, es funktioniert. Ich muà sagen daà ich das
Konzept vorher nicht kannte.
GrüÃe,
Torsten.
Re: File::Find, Variablen an "wanted"übergeben?
am 24.03.2006 03:30:23 von David Haller
Torsten Mohr wrote:
> das Modul File::Find ist sehr hilfreich.
>
> Allerdings vermisse ich die Möglichkeit, zusätzliche Daten an
> die aufgerufene Funktion 'wanted' zu übergeben. Falls diese
> Funktion noch weitere Parameter benötigt (z.B. einen Filter-String),
> dann kann ich den nur als globale Variable angeben.
>
> Oder habe ich da was übersehen?
Moeglicherweise 'preprocess' und 'postprocess'.
Hilft aber wohl nur, wenn du die Dateiliste "filtern" willst, mit der
wanted aufgerufen wird. Schema:
find( {
wanted => \&wasauchimmer,
preprocess => sub { grep(/muster/, @_); }
}, $dir);
was aequivalent funktioniert zu:
sub wasauchimmer {
return unless /muster/;
...
}
HTH,
-dnh
--
SYNOPSIS
glimpse - [almost all letters] pattern