我正在尝试使用(作为练习)文件查找回调功能来过滤源文件。它到目前为止还没有工作,只是在阳光下抓住所有东西。
你能指出我的方向吗?#!/usr/local/bin/perl
use strict;
use warnings;
use File::Find;
my @srcFiles;
my @srcExt = qw(cpp h py pl);
my @startDir = qw(.);
find( sub{
my @fields = split /'.'/, $File::Find::name;
push @srcFiles, $File::Find::name if grep $fields[-1], @srcExt;
},
@startDir);
print 'Source files found: ', @srcFiles;
由于
答案 0 :(得分:4)
你的问题出在你的分裂
中 my @ar = split /'.'/, $File::Find::name;
^
here is your problem.
您想要使用点拆分文件,所以您尝试了'.'
。但它并没有逃脱。逃避角色使用反斜杠。所以语法应该是
my @ar = split /\./, $File::Find::name;
所以你的代码是,
find( sub{
my @fields = split /\./, $File::Find::name;
push @srcFiles, $File::Find::name if grep $fields[-1], @srcExt;
},
@startDir);
或者尝试以下内容,这比你的代码更有效,它会修复@hobbs在评论中提到的一些错误。
通过管道分离加入数组。然后使用预编译的正则表达式(qr)添加非捕获组。然后将变量解析到子例程中并进行检查。
#!/usr/local/bin/perl
use strict;
use warnings;
use File::Find;
my @srcFiles;
my @srcExt = qw(cpp h py pl);
my $match = join("|",@srcExt);
$match = qr/\.(?:$match)$/;
my @startDir = qw(.);
find(sub
{
my $s = $File::Find::name;
push(@srcFiles,$s) if($s =~m/$match/);
}
, @startDir);
print @srcFiles;
答案 1 :(得分:1)
my @fields = split /'.'/, $File::Find::name;
这个正则表达式将文件名分割为找到撇号,后跟任何字符,后跟撇号。这绝对不是你想要的。
相反,请尝试:
my @fields = split /\./, $File::Find::name;