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>;

但我需要帮助打印两个标签之间的所有内容。

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 回答