使用Perl和Regex将文件名排序为数组

KAK*_*KAK 2 regex perl

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;
}
Run Code Online (Sandbox Code Playgroud)

错误在代码push(@files); 错误是: Useless use of push with no values

我想使用正则表达式来处理名称结尾.htm.html@files数组中的文件,/\.htm/请帮助我.

amo*_*mon 5

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

my @even = grep { $_ % 2 == 0 } 1 .. 10; # even number in the interval [1, 10].
Run Code Online (Sandbox Code Playgroud)

在我们的例子中,我们可以做到

my @files = grep { /\.htm/ } readdir $dh;
Run Code Online (Sandbox Code Playgroud)

如果你想使用push的话(一)已指定要推到阵列上的东西,和(b)只应做推,如果正则表达式匹配,而不是它匹配:

for my $file (@all_files) {
  push @files, $file if $file =~ /\.htm/;
}
Run Code Online (Sandbox Code Playgroud)