1

Perl モジュールを使用せずに、ほんの数行のコードで Perl で次のことを実行できますか?

find . -type f | xargs grep -l "2000.*Created" | cut -c3-100

上記は、「2000.*Created」を含むファイルのファイル名だけを示しています。これを Perl で実行し、結果を配列 (ファイル名の配列) にプッシュしたいと考えています。

Perl File::Finder モジュールにも同様の機能があることがわかりましたが、現在の作業環境では、どのモジュールにもアクセスしたりダウンロードしたりできません。

これは 1 行または 2 行のコードで実行できますか?

4

2 に答える 2

1

もちろん可能です。

perl -MFile::Find -lwe '
    find(sub { -f && push @ARGV, $File::Find::name }, '.'); 
    while(<>) { if (/2000.*Created/) { print substr($ARGV,2); close ARGV; } }'

File::Findはコア モジュールであるため、既にシステムにインストールされているはずです。サブルーチンはすべてのfind通常のファイルを見つけて にプッシュし@ARGV、ダイヤモンド演算子でそれらを読み取ることができるようにします。次に、ファイルをループして、正規表現でコンテンツをチェックします。見つかった場合は、最初の 2 文字を除いたファイル名を出力します (これは と同等だと思いcut -c3-100ます)。close ARGVラインは、複数の一致を防ぐためのショート サーキットです。

于 2013-02-06T01:09:45.883 に答える
0

私はFile::Findがこの例の方が好きです-それははるかに移植性が高く、File::Findは本当に気の利いたことをすることができます。ただし、サポートが組み込まれていない他のコマンドに役立つアプローチについて説明します。

open F,'find . -type f | xargs grep -l "2000.*Created" | cut -c3-100 |' || die 'cannot execute';
while(<F>) { chomp ; push(@a,$_)}

開いている後のパイプ(|)に注意してください... Perlは自動的にパイプを接続するすべての作業を行うため、これは重要です。

これは、新しい3引数openを使用して記述することもできます。

open my $fh, '-|', 'find . -type f | xargs grep -l "2000.*Created" | cut -c3-100' || die 'cannot execute';
while(<$fh>) { chomp ; push(@a,$_)}

ちなみにfind | xargs、スペースを含むファイル名がある場合、いくつかの問題が発生します。-print0アクションをオンにfindして-0フラグをオンにすると、これを回避できますxargs

find . -type f -print0 | xargs -0 -l "2000.*Created" | cut -c3-100
于 2013-02-07T03:55:46.843 に答える