2
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/

4

3 回答 3

5

解决这个问题的最简单方法是使用grep内置函数:它从条件为真的列表中选择那些元素,然后返回所有匹配元素的列表,例如

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/;
}
于 2013-05-03T08:33:37.833 回答
2

amon已对您的问题给出了正确答案,grep用于过滤文件名。但是,您尝试完成的功能对我来说更像是glob

my @html_files = glob("*.html *htm");  # html files

您还可以插入目录:

my $dir = "foo";
my @html_files = glob("$dir/*.html $dir/*.htm");
于 2013-05-03T09:16:20.583 回答
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'
        ];
于 2013-05-03T08:44:57.527 回答