无法使用范围运算符从文件中查找匹配的文本

时间:2017-02-13 11:12:00

标签: perl

我无法使用范围运算符在我的下面的程序中查找提供的2个文本的开头和结尾之间的文本,即$ kw1和$ kw2.我正在从名为oiutput.txt的文件中读取$ kw1和@ kw2在这个计划中。 有人可以帮忙说出为什么我的范围操作员没有给出我想要的o / p吗?

my $file = "output.txt";

my $kw1 = "Session Initiation Protocol (REGISTER)";
my $kw2 = "CSeq: 3 REGISTER";   

open(my $fh, '<', $file) or die $!;
my @content = <$fh>;

#print @content;

foreach (@content) {

#print $kw1;
#print $kw2;

if (/$kw1/ .. /$kw2/) {
    print "$_\n";
    }
}

我从Is搜索的样本数据:

CSeq: 3 REGISTER
Session Initiation Protocol (REGISTER)
                Temp
                Temp
                Session Initiation Protocol (REGISTER)
        Session Initiation Protocol (REGISTER)
CSeq: 2 REGISTER
CSeq: 1 REGISTER
CSeq: 0 REGISTER

2 个答案:

答案 0 :(得分:1)

好的,我认为首先 - 您的问题是范围运算符是错误的方法,因为CSeq: 3 REGISTERSession Initiation Protocol \(REGISTER\)之前来自文件中的

但你已经评论了一些测试结果:

  

1不行1 - 数据结构应该相同#Failed测试'数据结构应该相同'#在E:\ Automation相关\ Perl脚本 - ALL \ IMS_debugging \ test.pl第17行。#结构开始不同at:#$ got-&gt; {j} ='867-5309x'#$ expected-&gt; {j} ='867-5309'#看起来你1次测试1失败

这与你给我们的样本没有任何关系 - 数据中没有数字,x也没有。

但无论如何,这确实有效:

#!/usr/bin/perl

use strict;
use warnings;
my $file = "output.txt";


my $kw1 = "Session Initiation Protocol (REGISTER)";
my $kw2 = "CSeq: 3 REGISTER";   

while (<DATA>) {

   if ( /\Q$kw2\E/ ... /\Q$kw1\E/ ) {
      print;
   }
}


__DATA__
CSeq: 3 REGISTER
Session Initiation Protocol (REGISTER)
                Temp
                Temp
                Session Initiation Protocol (REGISTER)
        Session Initiation Protocol (REGISTER)
CSeq: 2 REGISTER
CSeq: 1 REGISTER
CSeq: 0 REGISTER

您需要\Q \E因为()是正则表达式元字符。您可以改为使用quotemeta

如果您需要匹配“会话启动协议”的第二个实例,那么匹配的空格就可以实现。

if ( /\Q$kw2\E/ ... /\s\Q$kw1\E/ ) 

答案 1 :(得分:0)

我相信这可能会做,没有经过测试,所以请匹配。

  use strict;
  use warnings;
  my $file = "output.txt";

  open(my $fh, '<', $file) or die $!;
  while ( <$fh> ) {

  if (/Session Initiation Protocol \(REGISTER\)/ .. /CSeq: 3 REGISTER/) {
      print "$_\n";
      }
  }