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

しかし、そうではありません。t仕事=\­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

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 に答える