【问题标题】:How can I use a variable's value as a glob pattern in Perl?如何在 Perl 中将变量的值用作 glob 模式?
【发布时间】:2011-01-16 20:41:06
【问题描述】:

在 Perl 中,您可以获得匹配模式的文件列表:

my @list = <*.txt>;
print  "@list";

现在,我想将模式作为变量传递(因为它已传递给函数)。但这不起作用:

sub ProcessFiles {
  my ($pattern) = @_;
  my @list = <$pattern>;
  print  "@list";
}

readline() on unopened filehandle at ...

有什么建议吗?

【问题讨论】:

    标签: perl file design-patterns glob


    【解决方案1】:

    使用glob:

    use strict;
    use warnings;
    
    ProcessFiles('*.txt');
    
    sub ProcessFiles { 
      my ($pattern) = @_; 
      my @list = glob $pattern;
      print  "@list"; 
    } 
    

    以下是您收到警告的原因的解释,来自I/O Operators

    如果尖括号包含的是 一个简单的标量变量(例如, $foo),那么该变量包含 要输入的文件句柄的名称 from... 将内部函数直接调用为 glob($foo) 被认为更简洁,这可能是首先完成它的正确方法。)

    【讨论】:

      【解决方案2】:

      为什么不将文件列表的数组引用传递给函数?

      my @list = <*.txt>;
      ProcessFiles(\@list);
      
      sub ProcessFiles {
          my $list_ref = shift;
          for my $file ( @{$list_ref} ) {
              print "$file\n";
          }
      }
      

      【讨论】:

      • 我知道有人会建议这样做。问题是它实际上是一个变量,就像这样:my $pattern = "test-%d-*.txt"; ProcessFiles(sprintf($pattern, "51"));
      【解决方案3】:
      use File::Basename;
      @ext=(".jpg",".png",".others");
      while(<*>){
       my(undef, undef, $ftype) = fileparse($_, qr/\.[^.]*/);
       if (grep {$_ eq $ftype} @ext) {
        print "Element '$ftype' found! : $_\n" ;
       }
      }
      

      【讨论】:

        【解决方案4】:

        用“eval”命令包装它怎么样?像这样……

        sub ProcessFiles {
          my ($pattern) = @_;
          my @list;
          eval "\@list = <$pattern>";
          print @list;
        }
        

        【讨论】:

        • 永远,永远,永远,永远不要这样做。 glob 运算符是正确答案。
        • 你是对的,glob 是一个更好的答案。感谢您的更正。为什么“永远、永远、永远、永远”这样做?
        • 罗伯特,你应该尽可能避免使用字符串eval;谁知道$pattern 中可能会出现哪些恶意数据,特别是如果这些数据来自用户输入。即使不是恶意的,奇怪的东西进入eval 也可能导致许多痛苦的错误。
        猜你喜欢
        • 2020-06-12
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2011-02-08
        • 1970-01-01
        相关资源
        最近更新 更多