1

テキスト文字列の出現回数をカウントしようとしています。

以下の私のPerlコードは、特定の種類のファイルが見つかったときにステートメント(テキスト文字列)を出力し、文字列を出力する回数をカウントする必要があります。

elsif ($elt =~ /DELETE_.+\.XML/) {
    print "  <-- Delete XMLs !!";
}

私はperlを学ぼうとしているだけで、プログラマーではありません。ですから、答えを説明してください。

挿入、並べ替え、マージはしたくありません。数えるだけです。

4

3 に答える 3

4

に一致する名前を持つディレクトリ内のすべてのファイルをカウントする場合は、次の/DELETE_.+\.XML/ようにします。

  1. ディレクトリを開きます。
    Perl では、これは

    opendir my $directory, "path/to/dir" or die "Error while opening: $!";
    

    次に、このディレクトリへのハンドル$directoryを表す変数です。

  2. ディレクトリ内のすべてのファイルを取得します。
    Perl では、次のreaddir関数を使用できます。

    my @files = readdir $directory;
    

    $directoryこれにより、そのすべての内容がという配列に読み込まれ@filesます。

  3. パターンに一致するすべてのファイルを選択します。
    Perl では、特定の条件を満たす要素を次のように選択できますgrep

    my @interesting_files = grep {/DELETE_.+\.XML/} @files;
    #  ^--output                 ^--a  condition--^ ^--source
    

    条件を中括弧で囲みます。任意のコードを含めることができますが、ここでは正規表現のみを入れます。grepは一種のデータフィルターです。

  4. のすべての要素を数えます@interesting_filesPerl にはコンテキスト
    の概念があります。スカラー コンテキストリスト コンテキストがあります。関数と変数は、それぞれで異なる動作をします。配列がスカラー コンテキストで使用されている場合、その配列の要素数が返されます。関数でスカラー コンテキストを強制できます。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このブロックの外側が必要な場合は、それが使用されている最も外側のスコープで宣言する必要があります。または、まったく使用しませんが、それには欠点があります。mymy


非常に洗練されたソリューションでは、次のglob関数を使用します。

my $count =()= glob "DELETE_*.XML";

これにより、ディレクトリを手動で開く操作が抽象化され、Unix シェルでおなじみのグロビング構文が使用されます。これらは従来の正規表現ではありません。=()=疑似演算子は count-of として読み取ることができます。右側にリスト コンテキストを課しますが、左側にスカラー コンテキストを持たせることができます。

于 2012-10-30T18:52:42.507 に答える
2
elsif ($elt =~ /DELETE_.+.XML/) { 
   print " <-- Delete XMLs !!";
   $count++;   # Count number of times string is printed
}
于 2012-10-30T17:46:25.500 に答える
0

以下は、一致する行をカウントする必要があります。

use strict;
use warnings;

my $count = 0;

for (<>) {
  $count++ if /line-matches/;
}

print "count: $count\n";

これをファイル count.pl に配置すると、次のように実行できます。

perl count.pl file1 file2 file3 ...

パイプラインで使用する必要がある場合にも機能するはずです。

ls *.XML | perl count.pl
于 2012-10-30T17:46:27.300 に答える