0

以前に尋ねた質問のフォローアップとして、2つのファイルからデータを読み取り、1つのファイルを1行ずつ解析して、他のファイルの各行に含まれる文字列と一致するようにしようとしています。1つ目はログファイルで、2つ目はキーファイルと呼びます。foreachループを使用してキーファイルを反復処理し、その中に埋め込みます。これは、ログの各行をステップスルーするwhileループです。パターンマッチングを使用して特定の文字列を識別しようとしていますが、この文字列は2つのプラス記号(つまり+ name +)またはプラスとアスタリスク(つまり+ name *)で囲まれています。残念ながら、パターンマッチングを機能させることができませんでした。パターン検索コードセグメントの本文を以下に含めました。

foreach $element (@fr_array) {
open (LOGFILE, "<", $logname)  or die $!;
while (<LOGFILE>) { #While reading one line at a time from the log....
  chomp;
  $log_string = <LOGFILE>;
  if ($log_string =~ /\+$element\+/) {
     $fr_count++;
     print "Counter increment since $log_string is the same as $element.";
     $log_match++;
     }
  }

編集

フィードバックをありがとう、みんな...私が呼び出したコマンドのいくつかは、私がプログラムをたどって問題を見つけるのを助けるために使用されました....私はいくつかのアドバイスを受け、もう少し調査した後、使用しようとしています代わりにgrepコマンドを使用しますが、パターンマッチングはまだ正しく機能していないようです。検索文字列として何を使用しても、trueとして解決されているようです。私は一日中コードを調べてきましたが、ここからどこに行くべきかよくわかりません。正規表現で失敗した後、使用する別の検索文字列を使用することにしました。これは、いくつかの等号を除くすべてのリテラルで構成されています。さて、明確にするために、私はマッチが見つかったら何もすることに興味がありません。マッチがいくつあるかを追跡する必要があるので、カウンターを使用します。とにかく、私は今いる場所の更新されたコードセグメントを含めています。ループが正しく機能していることを確認しました。問題はパターンマッチングだけです。私は今結果を得ています、しかし数は正確ではありません....私のテストログは1か2だけを返すはずです、しかしそれは私に204を吐き出します。

open (LOGFILE, "<", $logname)  or die $!;
while($log_string = <LOGFILE>) {
   chomp $log_string;
   foreach $element (@fr_array) {
      $fr_count++ if (grep {"Action=123 Cls=AM"} $log_string)

皆様のご支援と忍耐に改めて感謝いたします。:)

4

2 に答える 2

1

コメントで指摘したように、perlで「grep-fkey_filelog_file」コマンドをシミュレートしようとしています。このgrepコマンドが役立つかどうかを確認してください。

このperlコードでは、@fr_arrayの各要素のファイルを開こうとしています。これは不要であり、コードを非効率的にします。さらに、修正が必要なwhileループでLOGFILEを2回読み取っています。サンプルコードは以下のように読むことができます。+または*は、正規表現の[\ +\*]と一致する可能性があることに注意してください。

open (LOGFILE, "<", $logname)  or die $!;
while(my $log_string = <LOGFILE>) {
  chomp $log_string;
  foreach $element (@fr_array) {
    if ($log_string =~ /\+$element[\+\*]/) {
      $fr_count++;
      print "Counter increment since $log_string is the same as $element.";
      $log_match++;
    }
  }
}
于 2012-08-22T21:40:46.573 に答える
0

質問を正しく理解しているかどうかは100%わかりません。
上で述べたように、これは「grep」を使用して非常に簡単に行うことができます。
2つのカウンターにはどのような目的がありますか?

これがperlの例です。

入力ファイル:

123456789abc
234567890abc
345678901abc
bla+bteam+bla
456789012abc
567890123abc
678901234abc
+cteam*
789012345abc
+ateam*
890123456abc
901234567abc
012345678abc

perlcode:

#!/usr/bin/env perl
use strict;

my @tags = ("ateam","bteam");

open LOGFILE, "< inputfile.txt" or dir $!;
my @input = <LOGFILE>;
close LOGFILE;

my ($fr_count, $log_match) = 0;
map { 
    chomp;
    foreach my $tag (@tags) { 
        /\+$tag[\+\*]/ && do { 
            print "Counter increment since $_ is the same as $tag.\n";
            $fr_count++; $log_match++;
        }
    }  
} @input;
于 2012-08-23T10:04:35.873 に答える