【发布时间】:2014-10-30 07:09:20
【问题描述】:
我的目标是递归地对特定文件进行多次搜索。所以我有这些文件:
/dir/here/tmp1/recursive/foo2013.log
/dir/here/tmp1/recursive/foo2014.log
/dir/here/tmp2/recursive/foo2013.log
/dir/here/tmp2/recursive/foo2014.log
2013 年和 2014 年表示文件最后修改的年份。
然后我想为每个目录树(tmp1 和 tmp2 同样)找到更新的文件 (foo2014.log)。
参考this answer我在script.pl中有以下代码:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
func("tmp1");
print "===\n";
func("tmp2");
sub func{
my $varName = shift;
my %times;
find(\&upToDateFiles, "/dir/here");
for my $dir (keys %times) {
if ($times{$dir}{file} =~ m{$varName}){
print $times{$dir}{file}, "\n";
# do stuff here
}
}
sub upToDateFiles {
return unless (-f && /^foo/);
my $mod = -M $_;
if (!defined($times{$File::Find::dir})
or $mod < $times{$File::Find::dir}{mod})
{
$times{$File::Find::dir}{mod} = $mod;
$times{$File::Find::dir}{file} = $File::Find::name;
}
}
}
这会给我这个输出:
Variable "%times" will not stay shared at ./script.pl line 25.
/dir/here/tmp1/recursive/foo2014.log
===
我有三个问题:
为什么函数
func的第二次调用不像第一次那样工作?变量只是在函数范围内定义的,为什么我会受到干扰?为什么我会收到变量
%times的通知,我该如何摆脱它?如果我在
func之外定义函数upToDateFiles,我会收到此错误:Execution of ./script.pl aborted due to compilation errors.我认为这是因为变量未在func之外定义。是否可以改变这一点并仍然获得所需的输出?
【问题讨论】:
-
您可以使用
my $upToDateFiles = sub { ...代替sub upToDateFiles { ...,在find 调用之前定义,并将其用作find($upToDateFiles, ...。 -
@Qtax 谢谢,这就像一个魅力!如果您能详细说明/解释一下并提出答案,我会很高兴。那时我也可以投票:)