我试图写一个简单的函数,它接受两个参数,输入目录和模式,并返回一个数组,其中包含名称中包含模式的匹配文件。
my $dir = "/drives/D/Desktop/perlscripts";
sub getfiles
{
my ($dirName, @patterns) = @_;
opendir(my $dir, $dirName) or die "Can't open '$dirName': $!";
my @return;
for my $file (readdir($dir))
{
for my $pattern (@patterns)
{
if ($file =~ /$pattern/)
{
print "$file \n";
push @return, $file;
# This avoids having the file in the result twice
last;
}
}
}
return @return;
}
my @plscripts = getfiles($dir, "pl");
print "@plscripts \n";
我在STDOUT中没有得到任何代码,经过一些测试后,我认为问题出在了。
使用更改进行编辑:正如您所看到的,我注释掉了#last;但是它会匹配每次迭代时的每个文件名。所以我最终在数组中有重复的条目。
答案 0 :(得分:2)
快速修复可以为您的第一个循环添加标签,然后将“last”更改为“next FILE”:
my $dir = "/drives/D/Desktop/perlscripts";
sub getfiles
{
my ($dirName, @patterns) = @_;
opendir(my $dir, $dirName) or die "Can't open '$dirName': $!";
my @return;
FILE:
for my $file (readdir($dir))
{
for my $pattern (@patterns)
{
if ($file =~ /$pattern/)
{
print "$file \n";
push @return, $file;
# This avoids having the file in the result twice
# last
next FILE;
}
}
}
return @return;
}
my @plscripts = getfiles($dir, "pl");
print "@plscripts \n";