に一致する名前を持つディレクトリ内のすべてのファイルをカウントする場合は、次の/DELETE_.+\.XML/
ようにします。
ディレクトリを開きます。
Perl では、これは
opendir my $directory, "path/to/dir" or die "Error while opening: $!";
次に、このディレクトリへのハンドル$directory
を表す変数です。
ディレクトリ内のすべてのファイルを取得します。
Perl では、次のreaddir
関数を使用できます。
my @files = readdir $directory;
$directory
これにより、そのすべての内容がという配列に読み込まれ@files
ます。
パターンに一致するすべてのファイルを選択します。
Perl では、特定の条件を満たす要素を次のように選択できますgrep
。
my @interesting_files = grep {/DELETE_.+\.XML/} @files;
# ^--output ^--a condition--^ ^--source
条件を中括弧で囲みます。任意のコードを含めることができますが、ここでは正規表現のみを入れます。grep
は一種のデータフィルターです。
のすべての要素を数えます@interesting_files
。Perl にはコンテキスト
の概念があります。スカラー コンテキストとリスト コンテキストがあります。関数と変数は、それぞれで異なる動作をします。配列がスカラー コンテキストで使用されている場合、その配列の要素数が返されます。関数でスカラー コンテキストを強制できます。scalar
my $count = scalar @interesting_files;
一緒に、これは次のコードを形成します。
opendir my $directory, "path/to/dir" or die "Error while opening: $!";
my @files = readdir $directory;
my @interesting_files = grep {/DELETE_.+\.XML/} @files;
my $count = scalar @interesting_files;
不要な変数を省略して暗黙のコンテキストを使用すると、これは次の 2 行に減らすことができます。
opendir my $directory, "path/to/dir" or die "Error while opening: $!";
my $count = grep {/DELETE_.+\.XML/} readdir $directory;
ただし、$count
囲んでいるブロック ( ) を離れるまでしか表示されないことに注意してください{...}
。$count
このブロックの外側が必要な場合は、それが使用されている最も外側のスコープで宣言する必要があります。または、まったく使用しませんが、それには欠点があります。my
my
非常に洗練されたソリューションでは、次のglob
関数を使用します。
my $count =()= glob "DELETE_*.XML";
これにより、ディレクトリを手動で開く操作が抽象化され、Unix シェルでおなじみのグロビング構文が使用されます。これらは従来の正規表現ではありません。=()=
疑似演算子は count-of として読み取ることができます。右側にリスト コンテキストを課しますが、左側にスカラー コンテキストを持たせることができます。