perl正则表达式,在单词connect之后选择单词

时间:2011-03-24 03:58:18

标签: perl

这是我的日志

connect
called
menu
transfer
disconnect
connect
called
transfer
disconnect

我想选择这个词,当这个词紧挨着, 当这个词喜欢

连接

菜单 传递 断开意味着,

我应该选择转移

这个词

如果我的流程像

连接 叫 传递 断开

然后我不想选择转移

这个词

3 个答案:

答案 0 :(得分:2)

您可以尝试以下方式:

更新为标准Perl发行版:

#!/usr/bin/perl
use strict;
use warnings;

my $count = 0;
while(<DATA>) {
    chomp;
    $count = 1 if $_ eq 'connect';
    if ($count == 3) {
        print "2 words after is : $_\n";
        $count = 0;
    }
    $count++ if $count;
}


__DATA__
connect
called
menu
transfer
disconnect
connect
called
transfer
disconnect

<强>输出:

2 words after is : menu
2 words after is : transfer

答案 1 :(得分:1)

使用正则表达式来解决此问题将假设您将日志文件放在单个变量中。如果您的日志文件不是很大,您可以按如下方式执行此操作:

use File::Slurp qw(slurp);
my $log = slurp('path/to/logfile');

或者,如果您不想使用非标准Perl模块:

{
  local $/;
  open my $fh, '<', 'path/to/logfile' or die $!;
  my $log = <$fh>;
  close $fh;
}

要获取传输后的单词与“connect”匹配的实例,但仅限于流程为menu -> transfer -> ...的情况,您可以执行以下操作:

while ( $log =~ m{menu\s+transfer\s+(\w*connect\w*)}g ) {
    print "transfer -> $1\n";
}

答案 2 :(得分:0)

为什么要使用正则表达式?这不是一个好的用例。刚

while (<>) { chomp; last if ($_ eq 'connect'); }
$_ = <>;
print;

会做的。