あなたがキーとしてファイル名とハッシュを作成するためにmap()
組み込み関数を使用することができますし、undef
または1
に値を設定するか、または他のいくつかのより便利な値
perl -MFile::Basename -E '
map { chomp; $filehash{$_} = (fileparse($_, qr/\..[^.]*$/))[2] }
qx(find ./ -type f -maxdepth 3 2>/dev/null) ;
say "$_ has $filehash{$_} extension" for keys %filehash ;'
あなたは、その後でフィルタリングできます。各ハッシュキーの値として、ファイルの拡張子(File::Basename
からfileparse()
と拡張子をつかむ)を使用します。
perl -MFile::Basename -E '
map { chomp; $files_ext{$_} = (fileparse($_, qr/\..[^.]*$/))[2] }
qx(find ./ -type f -maxdepth 3 2>/dev/null) ;
for $k (keys %files_ext) { say $k if $files_ext{$k} eq ".pdf" } ;'
あなたは、スクリプトとしてこれを書き換えることができます:
use v5.22;
use File::Basename ;
use List::Util 'any';
my %files_ext ;
my @ext = qw(.doc .xls) ;
my @list = qx(find ./ -type f -maxdepth 3 2>/dev/null) ;
map {
chomp;
$files_ext{$_} = (fileparse($_, qr/\..[^.]*$/))[2]
} @list ;
for my $k (keys %files_ext) {
say $k if (any { $_ eq $files_ext{$k} } @ext) ;
}
しかし、ファイルではなくあなたがあなたがファイルを見つけましょう様々なモジュールのいずれかを使用することができ、このようにフィルタリングするハッシュを構築しますシステムコマンドを実行せずにperlを使用してください。。例えば、。File::Find
には、コアperlディストリビューションが付属しています。 CPANから私のお気に入りのひとつはPath:::Iterator::Rule
です。あなたの質問は、find
の出力をハッシュに追加する方法を尋ねるので、私の答えはそのアプローチに焦点を当てています。
Path::Iterator::Rule
を使用してファイルを検索し、上記のように結果をフィルタリングするスクリプトです。ファイルの大規模なセットで
use File::Basename ;
use List::Util 'any';
use Path::Iterator::Rule;
my @exts = qw(.doc .xls);
my $rule = Path::Iterator::Rule->new()->max_depth(3);
my @dirs = $rule->all(".") ;
for my $file (@dirs) {
if (any { $_ eq (fileparse($file, qr/\..[^.]*$/))[2] } @exts) {
print "$file \n" ;
}
}
フィルタリング部(すなわちany()
への呼び出しを->all_fast()
と->all()
方法を交換するか、シフトすることにより、高速、これは(Path::Iterator::Rule
ドキュメントのPERFORMANCEセクションを参照)することが可能であってもよいですおよびfileparse()
)を、匿名サブルーチンsub{ ...}
を使用してフィルタされたファイルのリストを直接構築するカスタムルールに変換します。 「怠惰」イテレータ方法->iter()
または->iter_fast()
を使用する代わりに、リストインターフェースにも役立つようです
:Unixのfind()
にシステムコールを使用して、私のシステムで
use File::Basename;
use List::Util 'any';
use Path::Iterator::Rule;
my @exts = qw(.doc .xls);
my $rule = Path::Iterator::Rule->new()->max_depth(3);
$rule->and(
sub {
my $ext = (fileparse($_, qr/\..[^.]*$/))[2];
any { $_ eq $ext } @exts;
}
);
my $next = $rule->iter_fast(".");
while (defined(my $file = $next->())) {
print "$file\n";
}
は、すべての最速です。しかし、ファーストは必ずしも「ベスト」とは限りません。 perlモジュールは、システムコマンドの出力を単純にスラップするだけでは得られないエラー処理と安全性を提供します。
その他の参考資料
'find'を呼び出す特別な理由はありますか? 'File :: Find'と' File :: Find :: Rule'はかなり効果的です。 – Sobrique
'$ variable = qx(...)'は、配列の場合と同じように、応答文字列全体を行に分割するのではなく、スカラ変数に置きます。 '$ hash_file {$ some_extension} = $ variable'は、' $ some_extension'の値に応じて、その文字列をハッシュ要素にコピーします。しかし、あなたが実際にやろうとしていることは不明です。あなたのハッシュで何をしたいですか?あなたは名前のリストを拡張子でフィルタリングしようとしていると思いますか? – Borodin
はいボロディンはまさに私がやろうとしていることです。どのようにそれを行うことができます上の任意のポインター? – Milania