1

現在、私はこれをやっています:

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

        ...my processing code

    }, $inputdir
);

しかし、すべてのファイルをアルファベット順に処理したいのですが、最終的にはすべてのファイル名を配列に格納し、配列を並べ替えてから、for each ループを使用して処理コードをそこに配置したいのですが、どうすればよいか完全に行き詰まっています。やれ。

私はたくさんのグーグルを行ってきましたが、perl の他のすべてと同様に、すべてを実行する方法は何百もありますが、それらのどれも、私がやりたいことすべてを実行させてくれないようです。つまり、.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

4 に答える 4

2

File::Basename - ファイル パスをディレクトリ、ファイル名、サフィックスに解析し、 S​​chwartzian変換を使用して、次のようなファイル名に基づいてファイルを並べ替えることができます。

 @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

于 2011-01-12T05:54:06.883 に答える
1

File::Nextにはソートオプションがあります。

于 2011-01-12T08:01:20.977 に答える
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, $/;
}
于 2011-01-14T20:02:32.073 に答える
0

もう1つの解決策は、最初にFile::Basenameからファイル名を取得し、結果をキャッシュに配置するなどのハッシュキャッシングメソッドであり、次にキャッシュされた値を単純に並べ替えることができます。

my %cache;
foreach my $file (@files){
  $cache{$file} = fileparse($file, "\.html?");
}
@files = sort{$cache{$a} cmp $cache{$b}}@files;
于 2011-01-14T09:42:06.323 に答える