Arrays Perl-扫描目录中包含的文件名和填充数组中的模式

Arrays Perl-扫描目录中包含的文件名和填充数组中的模式,arrays,perl,file,subroutine,Arrays,Perl,File,Subroutine,我试图编写一个简单的函数,它接受两个参数,输入目录和模式,并返回一个数组,其中包含名称中包含模式的匹配文件 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($

我试图编写一个简单的函数,它接受两个参数,输入目录和模式,并返回一个数组,其中包含名称中包含模式的匹配文件

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;但是,是的,它匹配每个迭代中的每个文件名。因此,我在数组中得到了重复的条目。

快速修复方法是为第一个循环添加一个标签,然后将“最后一个”更改为“下一个文件”:


你为什么在那里有
@ARGV
?它携带命令行参数。将
@ARGV
更改为
@patterns
,它应该可以工作。我还建议您返回对
@return
的引用,因为这可能是一个很长的列表。另外,我没有得到你的
最后一个
——它在第一次匹配后打破了循环模式(成功的
如果
),因此你只对
@patterns
@zdim中的第一个模式进行有效测试,乍一看我也这么认为,但是
最后一个
打破了内部循环,阻止文件名与多个模式匹配。同样如此:
@ARGV
有没有办法将上述脚本合并到一个对所有子目录递归执行此操作的脚本中?我基本上想模仿shell的ls-lR | grep模式。@pilcrow嗯,没错——谢谢。提供一个列表
@patterns
来尝试,但一旦当前文件与它的模式匹配,就转到下一个文件。我现在明白了。你的评论不正确。你所说的和发布的代码完全一样。它可能更好或更好,但它不是一个“修复”。解决这个问题的方法是从OP“s
@ARGV
改为
@patterns
。好吧,出于某种奇怪的原因,我没有看到任何@ARGV!而且这是一个快速解决方案,不是最好的。哇……在最初的帖子中,我的$patterns(@ARGV)有
。这是一个很好的更改,但我根本不知道它会如何影响处理,这就是我所说的。如果
在内部循环中的计算结果为真,则这两种方法都会退出内部循环,并在外部循环中继续迭代一次
。对——确实如此。我认为唯一的错误是
@ARGV
,然后得到了修复。(可能是在弹出评论之后。)
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";