您应该使用处理所有混乱递归的File::Find
orFile::Find::Rule
模块。XML Parser
为什么要重新发明轮子?
使用File::Find
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
my @found;
find(\&wanted, 'P:/TeamMembers/rsacek/_INI');
foreach ( @found ) {
print "$_\n";
}
sub wanted {
return unless -f;
open my $fh, '<', $File::Find::name or warn "failed $!" and return;
while (<$fh>) {
push @found, $1 if /[">](.*?\.ini)["<]/ig;
}
close $fh;
}
但也许对于另一种方法,这应该可行。
我grep
对返回的不是文件的项目使用(主要是列表过滤的功能)。map
被用来抓取完整路径,而不是继续循环并寻找它。
#!/usr/bin/perl
use strict;
use warnings;
my $dir = 'P:/TeamMembers/rsacek/_INI';
opendir my $dh, $dir or die "failed opening '$dir' $!";
my @found;
foreach my $f ( map { "$dir/$_" } grep { -f "$dir/$_" } readdir $dh ) {
open my $fh, '<', $f or die "failed opening '$f' $!";
while ( <$fh> ) {
push @found, $1 if /[">](.*?\.ini)["<]/ig;
}
close $fh;
}
closedir $dh;
foreach ( @found ) {
print "$_\n";
}