2010-02-02 5 views
6

Mögliche Duplizieren:
How do I pass parameters to the File::Find subroutine that processes each file?Wie kann ich einen Parameter an die gewünschte Funktion übergeben, wenn Sie Perl's File :: Find verwenden?

Ein File::Find Modul wie dies in Perl verwenden können:

find(\&wanted, @directories); 

Wie können wir einen Parameter an die wanted Funktion hinzufügen?

Zum Beispiel möchte ich die Dateien in /tmp durchziehen extrahieren einige Informationen aus jeder Datei und das Ergebnis sollte in einem anderen Verzeichnis gespeichert werden. Das Ausgabeverzeichnis sollte als Parameter angegeben werden.

+0

Bitte beschreiben Sie genauer, was Sie zu tun versuchen, und ich werde meine Antwort aktualisieren. –

+0

Siehe auch http://stackoverflow.com/questions/2056649/how-do-i-pass-parameter-to-the-filefind-subroutine-that-processes-each-file –

+0

@ Sinan Ünür Ihre Bemerkung http://stackoverflow.com/questions/2056649/how-do-i-pass-parameters-to-the-filefind-subroutine-that-processes-each-file löste die meine Frage. Wenn Sie es als Antwort posten, werde ich als akzeptiert markiert – jojo

Antwort

10

Sie verwenden einen Verschluss:

use File::Copy; 

my $outdir= "/home/me/saved_from_tmp"; 
find(sub { copy_to($outdir, $_); }, '/tmp'); 

sub copy_to 
    { my($destination_dir, $file)= @_; 
    copy $file, "$destination_dir/$file" 
     or die "could not copy '$file' to '$destination_dir/$file': $!"; 
    } 
3

File::Find 's Vertrag gibt an, welche Informationen an &wanted übergeben werden.

Die gewünschte Funktion benötigt keine Argumente, sondern arbeitet durch eine Sammlung von Variablen.

  • $File::Find::dir ist das aktuelle Verzeichnis Name,
  • $_ der aktuelle Dateiname ist in diesem Verzeichnis
  • $File::Find::name ist der vollständige Pfad zur Datei.

Wenn es zusätzliche Informationen, die Sie in der Callback zur Verfügung stellen möchten, können Sie create a sub reference that calls your wanted sub with the desired parameters.

+0

Danke, Ich bin dieser Option bewusst, aber ich möchte wissen, ob es einige Hack-to-Pass-Parameter gibt (nicht global). – jojo

4

Sie können jede Art von Code-Referenz erstellen, die Sie mögen. Sie müssen keinen Verweis auf eine benannte Subroutine verwenden. Für viele Beispiele, wie dies gemacht wird, siehe mein File::Find::Closures Modul. Ich habe dieses Modul erstellt, um genau diese Frage zu beantworten.

+0

Das mag für mich funktionieren – jojo