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
2
A
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";
}
}
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
- 1. org.xml.sax.SAXParseException: fin prématurée du fichier
- 2. org.xml.sax.SAXParseException: Fin prématurée du fichier
- 3. org.xml.sax.SAXParseException: Fin prématurée du fichier
- 4. Fin prématurée de l'analyse du fichier XML
- 5. Axis: faultString: org.xml.sax.SAXParseException: fin prématurée du fichier
- 6. fin prématurée du fichier dans Eclipse
- 7. montrant la fin prématurée du fichier
- 8. Sortie prématurée de dispatch_asycn, Grand Central Dispatch
- 9. Valeur variable provoquant une sortie prématurée du programme
- 10. "org.xml.sax.SAXParseException: fin prématurée du fichier." lors de l'analyse du schéma
- 11. `ls -lR` sortie au format de sortie` find`
- 12. Comment exécuter du code uniquement après la fin de Find :: Find de Perl?
- 13. Ruby prématurée EOF?
- 14. Sortie ruby prématurée sur le programme RAM intensif
- 15. Obtention de la fin prématurée du fichier Exception
- 16. javax.xml.stream.XMLStreamException: fin prématurée du fichier rencontré à welogic
- 17. sortie Perl dans le fichier CSV
- 18. linux find commande sortie traversant
- 19. Fin prématurée des en-têtes de script (Perl)
- 20. Perl "Fin prématurée des en-têtes de script" erreur
- 21. Perl: ajout du nom de fichier d'entrée à la sortie du nom de fichier
- 22. Perl: Ouverture du fichier
- 23. Capturez la sortie du système Perl()
- 24. Equivalent Python de l'URI de Perl :: Find
- 25. FORTRAN rencontre EOL prématurée
- 26. Réprimant finalisation prématurée du flux dans .NET
- 27. La sortie de Perl s'annule
- 28. Savon fin prématurée
- 29. CakePHP - fonction délivrer en sortie find() requête
- 30. Sortie graphique en Perl
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
@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
@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. –