0

「キーワード:マルチノード」のようなパターンがあります。ここで、ディレクトリ内のすべてのファイルでこのパターンを検索する必要があります。ファイルのいずれかにパターンが見つかった場合は、空でない文字列が返されます。ファイル名またはディレクトリ名が含まれる場合があります

シェルスクリプトでは、次のように同じことを行います

KeyMnode=grep -w "keyword : Multinode" ${dirname}/*

私は find(subroutine,directory_path) を使用することを考え、サブルーチン内ですべてのエントリについてディレクトリ全体をトラバースしたいと考えました。すべてのエントリについて、それが読み取り可能なファイルかどうかをチェックしたいと思います。ファイルが読み取り可能であれば、見つかったファイルで必要なパターン「キーワード: マルチノード」を検索したいと考えています。成功した場合、find コマンド全体が空でない文字列 (できれば既存のディレクトリ名のみ) になり、それ以外の場合は空の文字列になります。さらに情報が必要な場合はお知らせください。

これをperlで実現したい。解決策を教えてください。

4

1 に答える 1

0

あなたが説明したことを行うのに役立ついくつかのPerlツールを次に示します。

  • File::Findは、ディレクトリとその子のファイルを再帰的に検索し、\&wanted各ファイルに対してコード (ドキュメントのコールバック) を実行して、基準を満たすかどうかを判断します。
  • -rオペレータは、ファイルが読み取り可能かどうかを教えてくれます( if (-r $file_name)...)
  • openはファイルへのアクセスを取得し、<$fh>その内容を読み取って、ターゲットパターンと一致するかどうかを正規表現で確認できるようにします
  • \bパターンの先頭と末尾に追加すると、grep-wswitchと同様に、単語の境界でのみ一致するようになります

より具体的な問題がある場合は、発生すると予想したことと、実際の結果が予想とどのように異なっていたかの両方のステートメントを含め、それらを示すコードとともに追加の質問を投稿してください。これらの問題の解決を喜んでお手伝いします.

編集:コメントからクリーンアップされ、実行可能なバージョンのコード:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

use File::Find;

# Get $dirname from first command-line argument
my $dirname = shift @ARGV;

find(\&do_process, $dirname); # quotes around $dirname weren't needed

my ($KeyMnode, $KeyThreads);

sub do_process {
#  chomp($_); - not needed; $_ isn't read from a file, so no newline on it
  if (-r $_) {  # quotes around $_ weren't needed
    # $_ is just the final part of the file name; it may be better for
    # reporting the location of matches to set $file_name to 
    # $File::Find::name instead
    my $file_name = $_;
    open(my $fh, '<', $file_name);  # Use three-arg open!
    while (<$fh>) {
      chomp();
      # Note that, if you store all matches into the same scalar values,
      # you'll end up with only the last value found for each pattern; you
      # may want to push the matches onto arrays instead.
      if (/\bkeyword : Multinode\b/i) { $KeyMnode   = "$file_name:$_"; }
      if (/\bkeyword : Threads\b/i)   { $KeyThreads = "$file_name:$_"; }
    }
  }
}
于 2013-02-19T09:30:20.170 に答える