我有一个大文件,看起来像这样:
<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>;
但我需要帮助打印两个标签之间的所有内容。
答案 0 :(得分:5)
您的正则表达式逐行处理数据,但您的字符串跨越多行。您可以使用range operator:
while (<$DATA>) {
print if /$input/ .. /$end/;
}
如果要排除边框线,可以将内线更改为
print if (/$input/ .. /$end/) !~ /^1$|E0/}
DATA是预定义的文件句柄。考虑使用其他名称,或使用词法文件句柄(在我的示例中为$DATA
)。
答案 1 :(得分: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;
(由于原始代码中的错误而进行了多次编辑)