File::Findモジュールを使用しないのはなぜですか? Perl 5.x 以降、Perl のほぼすべてのディストリビューションに含まれています。動作がややこしいので、私のお気に入りのモジュールではありませんが、うまく機能します。
必要なことを行うサブルーチンを定義し、wanted
不要なものを除外します。この場合、ほとんどすべてをwanted
印刷しているので、見つかったものを印刷するだけです。
ではFile::Find
、ファイルの名前は に保持され$File::Find::name
、そのファイルのディレクトリは にあります$File::Find::dir
。は$_
ファイル自体であり、テストに使用できます。
これがあなたが望むものの基本的な方法です:
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
find ( \&wanted, $directory );
sub wanted {
say $File::Find::Name;
}
wanted
私は自分の関数をサブルーチンに入れることを好むfind
ので、それらは一緒です。これは上記と同等です:
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
find (
sub {
say $File::Find::Name
},
$directory,
);
優れたプログラミングでは、サブルーチンで印刷しないように指示されています。代わりに、サブルーチンを使用してデータを格納して返す必要があります。残念ながら、find
何も返されません。グローバル配列を使用してファイルのリストをキャプチャし、後でそれらを出力する必要があります。
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
my @directory_list;
find (
sub {
push @directory_list, $File::Find::Name
}, $directory );
for my $file (@directory_list) {
say $file;
}
wanted
または、別のサブルーチンが必要な場合:
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
my @directory_list;
find ( \&wanted, $directory );
sub wanted {
push @directory_list, $File::Find::Name;
}
for my $file (@directory_list) {
say $file;
}
必要なサブルーチンが、サブルーチンに対してローカルではない配列に依存しているという事実が気になります。そのため、wanted
呼び出し内にサブルーチンを埋め込むことを好みfind
ます。
できることの 1 つは、サブルーチンを使用して必要なものを除外することです。JPG ファイルのみに関心があるとします。
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
my @directory_list;
find ( \&wanted, $directory );
sub wanted {
next unless /\.jpg$/i; #Skip everything that doesn't have .jpg suffix
push @directory_list, $File::Find::Name;
}
for my $file (@directory_list) {
say $file;
}
配列にプッシュする前に、必要なサブルーチンが不要next
なファイルに対してどのように実行するかに注意してください。@directory_list
繰り返しますが、私は埋め込みを好みます:
find (sub {
next unless /\.jpg$/i; #Skip everything that doesn't have .jpg suffix
push @directory_list, $File::Find::Name;
}
Find::File
これがあなたの質問と正確に一致しないことは承知していますが、モジュールについてお知らせし、Perl に多くの機能を追加できる Perl モジュールを紹介したかっただけです(それらについてまだ知らなかった場合)。