Как получить список всех HTML-файлов во всех подкаталогах, отсортированных по алфавиту в Perl? - PullRequest
1 голос
/ 12 января 2011

В настоящее время я делаю это:

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

        ...my processing code

    }, $inputdir
);

Но я хочу обработать все файлы в алфавитном порядке, в конечном итоге я хотел бы сохранить все имена файлов в массиве, отсортировать массив, а затем использоватьдля каждого цикла и помещаю туда свой код обработки, но я полностью застрял, как это сделать.

Я много гуглил, но, как и все остальное в perl, есть сотни способов сделать все,и ни один из них, похоже, не позволяет мне делать все, что я хочу, то есть все файлы, заканчивающиеся на .html, все подкаталоги в определенном каталоге и отсортированные в алфавитном порядке по имени файла, а не по структуре каталога.

Кто-нибудь может мне помочь?Я знаю, что это можно сделать довольно легко, я просто не могу понять.

Спасибо:)

edit: я пытался сделать это:

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 ]

2 голосов
/ 12 января 2011

вы можете использовать File :: Basename - Разобрать пути к файлам в каталог, имя файла и суффикс и Преобразование Шварца для сортировки файлов по имени файла, например,

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

Процедура fileparse() File :: Basename делит путь к файлу на $directories, $filename and (optionally) the filename $suffix., поэтому получите filename и передайте его в Schwartzian transform для сортировки.

1 голос
/ 12 января 2011

Файл :: Далее имеет параметры сортировки.

0 голосов
/ 14 января 2011

Это будет , а не будет победителем в производительности, но он включен, чтобы показать превосходное 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, $/;
}
0 голосов
/ 14 января 2011

Еще одним решением могут быть методы хеширования , например, сначала получить имя файла из File :: Basename и поместить результаты в кеш, а затем мы можемзатем просто отсортировать кэшированные значения, т.е.

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