2011-12-31 3 views
2

En Perl, nous effectuons généralement une traversée de répertoire récursive en utilisant File::Find et nous utilisons souvent du code similaire à ci-dessous pour trouver certains fichiers basés sur un modèle. Ceci est généralement assez flexible, mais il y a certains moments où nous voulons sortir prématurément de la découverte. Existe-t-il une méthode définie dans Perl pour le faire?Sortie prématurée du fichier Perl :: Find

Répondre

3

Essayez si cette possibilité pourrait travailler pour vous:

die intérieur find fonction et entourer l'appel dans une fonction eval pour piéger l'exception et poursuivre l'exécution de votre programme.

eval { find(\&filter, $somepath) }; 
print "After premature exit of find...\n"; 

Et à l'intérieur filter fonction:

sub filter { 
    my $srcfile = $_; 
    if -f $srcfile && $srcfile =~ /<CERTAIN PATTERN>/ { 
     die "Premature exit"; 
    } 
} 
+0

Merci ce fut la chose exacte que je cherchais :-). BTW est-il une raison particulière pour laquelle vous avez dit «Essayez si cette possibilité pourrait fonctionner pour vous:». Y at-il un scénario où cela échouerait? – Abhijit

+0

@Abhijit: Insécurité, rien d'autre. J'apprends perl mais je suis encore un débutant et même si je l'ai testé avant de poster la solution, ne vous sentez pas sûr de dire que c'est la meilleure solution. Il y a beaucoup d'experts perl dans ce site qui seront en mesure d'expliquer en détail les avantages et les inconvénients de cette solution et d'autres. J'essaie juste d'aider autant que je peux, et j'apprends, bien sûr. – Birei

+0

@Birei => Si vous l'écrivez comme 'eval {...; 1} ou imprimez "chaîne d'erreur: $ @" 'alors vous ne recevrez pas le message d'erreur si' find' se termine normalement. C'est parce que 'eval' retournera la dernière expression du bloc en cas de succès, et' undef' en cas d'échec. Donc, terminer le bloc avec '; 1' transforme' eval' en opérateur booléen pour faciliter le chaînage ou le test avec les conditions. –

2

Vous pourriez faire:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use File::Find; 
my $somepath = q(.); 
my $earlyexit; 

find(\&filter, $somepath); 
sub filter { 
    my $srcfile = $_; 

    $File::Find::prune = 1 if $earlyexit; #...skip descending directories 

    return if $earlyexit;     #...we have what we wanted 

    if ( -f $srcfile && $srcfile =~ /<CERTAIN PATTERN>/) { 
    #...<Some Processing which requires premature exit> 
    # ... 
     $earlyexit = 1; 
    } 
} 
+0

C'est un bon hack mais la solution de Birei est plus élégante. En outre, cela ne se termine pas prématurément pour le répertoire en cours, mais saute juste le traitement restant. – Abhijit

Questions connexes