Perl - 扫描目录以查找包含的文件名和填充数组中的模式
Perl - Scan directory for pattern in contained filenames and fill array
我已经尝试编写一个简单的函数,它接受两个参数,输入目录和模式,以及 returns 一个数组,其中包含名称中包含模式的匹配文件。
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;但是是的,它在每次迭代时都匹配每个文件名。所以我最终在数组中得到了重复的条目。
快速修复可以为您的第一个循环添加标签,然后将 "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";
我已经尝试编写一个简单的函数,它接受两个参数,输入目录和模式,以及 returns 一个数组,其中包含名称中包含模式的匹配文件。
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;但是是的,它在每次迭代时都匹配每个文件名。所以我最终在数组中得到了重复的条目。
快速修复可以为您的第一个循环添加标签,然后将 "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";