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

时间:2016-05-05 21:38:25

标签: 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($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;但是它会匹配每次迭代时的每个文件名。所以我最终在数组中有重复的条目。

1 个答案:

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