如何在Perl中将变量的值用作glob模式?

时间:2010-02-15 03:31:13

标签: perl file design-patterns glob

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

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

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

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

readline() on unopened filehandle at ...

有什么建议吗?

4 个答案:

答案 0 :(得分:12)

使用glob

use strict;
use warnings;

ProcessFiles('*.txt');

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

以下是I/O Operators

对您收到警告的原因的解释
  

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

答案 1 :(得分:0)

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

my @list = <*.txt>;
ProcessFiles(\@list);

sub ProcessFiles {
    my $list_ref = shift;
    for my $file ( @{$list_ref} ) {
        print "$file\n";
    }
}

答案 2 :(得分:0)

use File::Basename;
@ext=(".jpg",".png",".others");
while(<*>){
 my(undef, undef, $ftype) = fileparse($_, qr/\.[^.]*/);
 if (grep {$_ eq $ftype} @ext) {
  print "Element '$ftype' found! : $_\n" ;
 }
}

答案 3 :(得分:-1)

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

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