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

时间:2013-05-03 08:24:38

标签: 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;
}

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

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

3 个答案:

答案 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'
        ];