web-dev-qa-db-ja.com

Perlのディレクトリ内のファイルをループするにはどうすればよいですか?

可能性のある複製:
Perlを使用してディレクトリ内のすべてのファイルを一覧表示するにはどうすればよいですか?

同じディレクトリに含まれる数百のファイルをループしたい。 Perlでこれを行うにはどうすればよいですか?

27
adhanlon
#!/usr/bin/Perl -w

my @files = <*>;
foreach my $file (@files) {
  print $file . "\n";
}

どこ

 @files = <*>;

することができます

 @files = </var/www/htdocs/*>;
 @files = </var/www/htdocs/*.html>;

等.

48
EToreo

楽しい。

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
}
19
skarface

readdir または glob を使用できます。

または、 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を使用することをお勧めします。

13
Sinan Ünür