2012-08-27 48 views
0

之间抢夺文本我有一个大的文件,它看起来是这样的:Perl的正则表达式,标签

<Feed stack_overflow> 
    sourceid 32456 
    prefeed 1 
    <LOG> 
    level 1 
    cache info 
    </LOG> 
</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>; 

但我需要在两个标记之间打印出的一切帮助。

+1

我会建议这样一个XML解析器:https://metacpan.org/module/XML::Parser – squiguy

+1

是您的数据XML,还是它看起来像它? – mirod

+0

@mirod它看起来像它。 – Twistar

回答

5

你的正则表达式的工作原理与线数据线,但你的字符串跨越了几行。您可以使用range operator

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

如果你要排除的边界线,可以在内线改变

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

数据是预定义的文件句柄。考虑使用不同的名称,或使用词法文件句柄(在我的示例中为$DATA)。

+0

我无法得到这个工作。它编译但不返回任何结果。 – Twistar

+0

您必须将您的'open'改为'打开我的$ DATA,'<','file.config'或者死掉$ !;'。 – choroba

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; 

(由于原来代码中的错误几个编辑)