如何获取perl中按字母顺序排序的所有子目录中的所有html文件的列表?

时间:2011-01-12 04:22:49

标签: perl sorting perl-data-structures

目前我这样做:

# Find all files
File::Find::find(
    sub {
        my $file = $_;
        return if -d $file; 
        return if $file !~ /(.*)\.htm$/;

        ...my processing code

    }, $inputdir
);

但我想按字母顺序处理所有文件,最终我想将所有文件名存储在一个数组中,对数组进行排序,然后对每个循环使用a并将我的处理代码放在那里,但我完全是坚持怎么做。

我做了大量的谷歌搜索,但像perl中的其他所有内容一样,有100种方法可以做任何事情,而且似乎没有一个让我做我想做的所有事情,也就是所有以.html结尾的文件,特定目录中的所有子目录,并根据文件名按字母顺序排序,而不是其目录结构。

任何人都可以帮助我吗?我知道这可以很容易地完成,我只是想不出来。

谢谢:)

编辑:我试过这样做:

File::Find::find(
    sub {
        #Only process html files
        my $file = $_;
        return if -d $file; 
        return if $file !~ /(.*)\.htm$/;

        push(@files, $File::Find::name);

    }, $inputdir 
);

但是如果我对数组@files进行排序,它将根据整个字符串对其进行排序,我只想根据文件名对其进行排序。我不认为有一种方法可以使用File :: find:find,因为在遍历所有文件之前它无法知道订单是什么,所以我需要在之后进行排序。

4 个答案:

答案 0 :(得分:2)

您可以使用File::Basename - 将文件路径分析到目录,文件名和后缀以及Schwartzian transform,根据文件名对文件进行排序,例如,

 @files = map { $_->[0] }
    sort { $a->[1] cmp $b->[1] }
    map { [$_, fileparse($_, "\.html?")] } @files; 

File :: Basename的fileparse()例程将文件路径划分为$directories, $filename and (optionally) the filename $suffix.,因此请获取filename并将其传递到Schwartzian transform进行排序。

答案 1 :(得分:1)

File::Next有排序选项。

答案 2 :(得分:0)

另一个解决方案可能是哈希缓存方法,例如首先从File::Basename获取文件名并将结果放入缓存然后我们可以简单地排序在缓存的值上,即。,

my %cache;
foreach my $file (@files){
  $cache{$file} = fileparse($file, "\.html?");
}
@files = sort{$cache{$a} cmp $cache{$b}}@files;

答案 3 :(得分:0)

这将成为性能优胜者,但包括在内以显示优秀的File::Find::Rule,它对于小文件树来说可能很有趣并且可以接受。还使用Path::Class

use warnings;
use strict;
use File::Find::Rule;
use Path::Class qw( file );

my @files = map { file($_) }
    File::Find::Rule->file()
    ->name("*\.html")
    ->in(shift||".");

for my $file ( sort { lc($a->basename) cmp lc($b->basename) } @files )
{
    print $file, $/;
}