我无法使用范围运算符在我的下面的程序中查找提供的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
答案 0 :(得分:1)
好的,我认为首先 - 您的问题是范围运算符是错误的方法,因为CSeq: 3 REGISTER
在 Session 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";
}
}