2011-12-31 73 views
2

在Perl中,我们通常使用File::Find进行递归目录遍历,我们经常使用类似于下面的代码来基于模式来查找某些文件。过早退出Perl文件::查找

find(\&filter, $somepath); 
sub filter { 
    my $srcfile = $_; 
    if -f $srcfile && $srcfile =~ /<CERTAIN PATTERN>/ { 
     <Some processing which requires a premature exit> 
    } 
} 

这通常很灵活,但是有些时候我们想过早地退出查找。 Perl中有定义的方法来做到这一点吗?

回答

3

尝试,如果这种可能性可能会为你工作:在eval功能

diefind功能和环绕调用陷阱异常并继续执行程序。

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

而且里面filter功能:

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

谢谢,这是我一直在寻找:-)确切的事情。顺便说一句,有什么特别的原因,你为什么说'尝试这种可能性是否适合你:'。有什么情况会导致失败? – Abhijit 2011-12-31 18:03:49

+0

@Abhijit:不安全,没有别的。我正在学习perl,但我仍然是一个新手,尽管我在发布解决方案之前对其进行了测试,但不确定这是否是最好的解决方案。本站有许多perl专家将详细解释此解决方案和其他解决方案的优缺点。我尽可能地尽力提供帮助,并且学习,当然。 – Birei 2011-12-31 18:21:31

+0

@Birei =>如果你把它写成'eval {...; 1}或打印“错误字符串:$ @”'那么如果'find'正常结束,你不会得到错误信息。这是因为'eval'会在成功时返回块中的最后一个表达式,失败时返回'undef'。因此,以'; 1'结尾块将'eval'变成布尔运算符,以便轻松链接或使用条件进行测试。 – 2011-12-31 20:14:51

2

你可以这样做:

#!/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

这是一个很好的黑客,但Birei的解决方案更优雅。这实际上不会过早地退出当前目录,而只是跳过剩余的处理。 – Abhijit 2011-12-31 18:03:19