使用文件find来获取源文件

时间:2016-04-20 03:21:30

标签: perl

我正在尝试使用(作为练习)文件查找回调功能来过滤源文件。它到目前为止还没有工作,只是在阳光下抓住所有东西。

你能指出我的方向吗?

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

由于

2 个答案:

答案 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;