1

如何仅解析包含单词 QUERY 的行?我试过了:

my @strs  = loadf('ck.txt');    

while(1)
{
    my $str = shift @strs;
    if(!$str)   
    {
        exit;
    }
    if($str =~ /QUERY/)
    {
        ($cl) = $str =~ /QUERY: (.*?)/;
        open F, ">>go.txt";
        print F $cl;
        close F;    
    }
}




sub loadf {
    open (F, "<".$_[0]) or erroropen($_[0]);
    chomp(my @data = <F>);
    close F;
    return @data;
}

ck.txt:

22.11.2012 16:55:45 +02:00
IP: 99.992.92.992
QUERY: BANNER_LANG=ru; textext community-lang=ru
REFERER: http:/site.ru/827
AGENT: Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.10

22.11.2012 16:55:44 +02:00
IP: 89.189.191.6
QUERY: BANNER_LANG=ru; text; community-lang=ru
REFERER: http:/site.ru/444
AGENT: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.289 Version/12.00

但它没有吨工作=\­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

4

3 回答 3

1

你的问题是(.*?). ?使匹配不贪婪,因此它将匹配尽可能少的字符,同时仍满足正则表达式。在这种情况下,那总是零个字符。

此外,您的代码可以简化:

use strict;
use warnings;

my @strs  = ('BLAH', ' QUERY: foobarbaz', 'QUERY asdf');    

#open the file once: more efficient.
open my $file, '>>', 'go.txt' or die "Can't open file: $!";
for  my $str (@strs)
{
    #Perform all matching logic in one go.
    if($str =~ m/QUERY: (.*)/)
    {
        print {$file} $1;
    }
}
close $file;   
于 2012-11-22T15:45:51.727 回答
0

删除?以使其贪婪或$在关闭后添加)

例如

QUERY: (.*)

或者

QUERY: (.*?)$
于 2012-11-22T15:45:14.373 回答
0

你把事情复杂化了。您的问题可以通过单线解决:

perl -nlwe 'print if /^QUERY/' query.txt >> go.txt

^如果您的数据不规则,您可以考虑从正则表达式中删除行锚的开始。

如果你想删除这个词QUERY:,你可以使用这个单行:

perl -nlwe 'print if s/^QUERY:\s*//' query.txt >> go.txt

这个单行代码的解析代码是(为简单起见进行了编辑):

use warnings;                       # -w option: enable warnings
BEGIN { $/ = "\n"; $\ = "\n"; }     # -l option: handle line endings
while (<>) {                        # -n option: read input file or stdin
    chomp;                          # -l option again
    print $_ if s/^QUERY:\s+//;     # our code
}
于 2012-11-22T19:41:29.010 回答