同じディレクトリに含まれる数百のファイルをループしたい。 Perlでこれを行うにはどうすればよいですか?
#!/usr/bin/Perl -w
my @files = <*>;
foreach my $file (@files) {
print $file . "\n";
}
どこ
@files = <*>;
することができます
@files = </var/www/htdocs/*>;
@files = </var/www/htdocs/*.html>;
等.
楽しい。
opendir(DH, "directory");
my @files = readdir(DH);
closedir(DH);
foreach my $file (@files)
{
# skip . and ..
next if($file =~ /^\.$/);
next if($file =~ /^\.\.$/);
# $file is the file used on this iteration of the loop
}
または、 Path :: Class :などのモジュールを使用できます
通常、
children()
にはselfおよびparentエントリは含まれません。および..(または非Unixシステムでは同等のもの)、それは私が自分の祖父のビジネスのようなものだからです。これらの特別なエントリを含むすべてのディレクトリエントリが必要な場合は、allパラメータにtrue値を渡します。@c = $dir->children(); # Just the children @c = $dir->children(all => 1); # All entries
さらに、通常「非表示」のエントリをすべて除外するno_hiddenパラメーターがあります。これは、Unixでは、ドット(
.
)で始まるすべてのエントリを除外することを意味します。
@c = $dir->children(no_hidden => 1); # Just normally-visible entries
または、 Path :: Tiny :
@paths = path("/tmp")->children; @paths = path("/tmp")->children( qr/\.txt$/ );
ディレクトリ内のすべてのファイルとディレクトリの
Path::Tiny
オブジェクトのリストを返します。"."
および".."
を自動的に除外します。オプションの
qr//
引数が指定されている場合、指定された正規表現に一致する子名のオブジェクトのみを返します。一致にはベース名のみが使用されます。
@paths = path("/tmp")->children( qr/^foo/ );
# matches children like the glob foo*
ディレクトリエントリのリストを配列に取得すると、メモリが無駄になります(一度に1つのファイル名を取得するのではなく)が、数百個のファイルしかないため、これが問題になることはほとんどありません。
Path::Class
は、* nixおよびWindows以外のオペレーティングシステムに移植可能です。一方、私の知る限り、そのインスタンスはPath::Tiny
インスタンスよりも多くのメモリを使用します。
メモリに問題がある場合は、readdir
ループでwhile
を使用することをお勧めします。