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