0

次のような大きなファイルがあります。

<Feed stack_overflow>
   sourceid 32456
   prefeed 1
   <LOG>
     level 1
     cache info
  </LOG>
</Feed>

このファイル内のすべてを検索して、Feed タグを含むすべてを取得したいと考えています。したがって、32456 を検索すると、上記のコードのすべてが得られます。

私が今持っているコードは次のとおりです。

#!/usr/bin/perl
my $input = "<Feed stack_overflow"; #Search string
my $end = "</Feed>"; #End string
open (DATA, "file.config") or die "Error";

my @list = grep /\b$input\b(.*?)\b$end\b/, <DATA>;
chomp @list;
print "$_\n foreach @list;

しかし、結果が得られません。検索対象が存在することはわかっています。この正規表現を使用して、特定の文字列を含むすべての行を正常に出力できました。

my @list = grep /\b$input\b/, <DATA>;

しかし、2 つのタグの間のすべてを印刷するには助けが必要です。

4

2 に答える 2

5

正規表現は行ごとにデータを処理しますが、文字列は複数行にまたがっています。範囲演算子を使用できます:

while (<$DATA>) {
    print if /$input/ .. /$end/;
}

境界線を除外したい場合は、内側の線を

print if (/$input/ .. /$end/) !~ /^1$|E0/}

DATA は定義済みのファイル ハンドルです。別の名前を使用するか、レキシカル ファイル ハンドルを使用することを検討してください ($DATA私の例のように)。

于 2012-08-27T14:53:42.707 に答える
0
#!/usr/bin/perl
my $input = "<Feed stack_overflow"; #Search string
my $end = "</Feed>"; #End string
open (DATA, "file.config") or die "Error";

undef $/; # slurp mode
$_=<DATA>;
close DATA;

@list = m/\b$input\b(.*?)\b$end\b/mg;
map { print "found : $_\n" } @list;

(元のコードのエラーによるいくつかの編集)

于 2012-08-27T14:49:22.277 に答える