sub open_directory {
my $directory = shift @_;
my @files = ();
opendir (my $dh, $directory) or die "Couldn't open dir '$directory' : $!";
my @all_files = readdir $dh;
closedir $dh;
foreach my $files(@all_files){
while($files =~ /\.htm/){
push(@files);
}
}
return @files;
}
错误发生在代码push(@files);
错误是:
Useless use of push with no values
我想使用正则表达式.htm
处理.html
数组中名称以@files
或/\.htm/
结尾的文件,请帮帮我。
答案 0 :(得分:5)
解决这个问题的最简单方法是使用grep
内置函数:它从条件为真的列表中选择那些元素,然后返回所有匹配元素的列表E.g。
my @even = grep { $_ % 2 == 0 } 1 .. 10; # even number in the interval [1, 10].
在我们的案例中,我们可以做到
my @files = grep { /\.htm/ } readdir $dh;
如果你想使用push
,那么你(a)必须指定你要推送到数组上的内容,(b)只应该推送如果正则表达式匹配,而不是,匹配:
for my $file (@all_files) {
push @files, $file if $file =~ /\.htm/;
}
答案 1 :(得分:2)
amon已使用grep
过滤文件名,为您的问题提供了正确的答案。但是,您尝试完成的功能听起来更像glob
给我:
my @html_files = glob("*.html *htm"); # html files
您还可以插入目录:
my $dir = "foo";
my @html_files = glob("$dir/*.html $dir/*.htm");
答案 2 :(得分:0)
尝试理解下面的代码,这将只处理.htm或.html文件。
use strict;
use Data::Dumper;
my @all_files = ("abc.htm", "xyz.gif", "pqr.html") ;
my @files;
foreach my $files(@all_files){
if($files =~ /\.html?/){ # This will process only .htm or .html files
push(@files, $files);
}
}
print Dumper(\@files);
输出:
$VAR1 = [
'abc.htm',
'pqr.html'
];