在Perl中,您可以获得与模式匹配的文件列表:
my @list = <*.txt>;
print "@list";
现在,我想将模式作为变量传递(因为它传递给函数)。但这不起作用:
sub ProcessFiles {
my ($pattern) = @_;
my @list = <$pattern>;
print "@list";
}
readline() on unopened filehandle at ...
有什么建议吗?
答案 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;
}