我正在阅读具有此结构的文件:
Policy Map <mypolicy>
Class <myclass1>
priority 1150 (kbps) 106250
police cir 1152000 bc 144000 be 144000
conform-action set-dscp-transmit ef
exceed-action drop
violate-action drop
Class <myclass2>
bandwidth remaining 60 (%)
packet-based wred, exponential weight 9
我只想抓住这一段:
Class <myclass1>
priority 1150 (kbps) 106250
police cir 1152000 bc 144000 be 144000
conform-action set-dscp-transmit ef
exceed-action drop
violate-action drop
我正在尝试使用它:
open(DATA,$fichier) || die ("Erreur d'ouverture de $fichier\n") ;
while (<DATA>) {
if (/ Class <myclass1>/ .. / Class/) {
print $_ ;
# and insert into variable
}
}
close(DATA);
我尝试了不同的方式,但我仍然无法得到它。
答案 0 :(得分:4)
你必须使用三个点...
范围运算符,因为第二个条件匹配在同一行并且范围立即关闭,
if (/Class <myclass1>/ ... /Class/)
稍后您可以将...
视为匹配第二条件/Class/
。
来自perldoc
如果您不希望它在下一次评估之前测试正确的操作数,就像在sed中一样,只需使用三个点(“...”)而不是两个点。在所有其他方面,“......”的行为就像“......”一样。
答案 1 :(得分:0)
使用Range Operator ..
有两个细节需要考虑到您的问题:
如果您不希望范围在下次评估前测试正确的操作数,请使用三点式...
。
使用范围的返回值来过滤掉结束条件。
范围中的最终序列号具有字符串&#34; E0&#34;附加到它,它不会影响其数值,但如果要排除端点,则可以搜索一些内容。
以下展示:
use strict;
use warnings;
while (<DATA>) {
if (my $range = /Class <myclass1>/ ... /Class/) {
print if $range !~ /E/;
}
}
__DATA__
Policy Map <mypolicy>
Class <myclass1>
priority 1150 (kbps) 106250
police cir 1152000 bc 144000 be 144000
conform-action set-dscp-transmit ef
exceed-action drop
violate-action drop
Class <myclass2>
bandwidth remaining 60 (%)
packet-based wred, exponential weight 9
输出:
Class <myclass1>
priority 1150 (kbps) 106250
police cir 1152000 bc 144000 be 144000
conform-action set-dscp-transmit ef
exceed-action drop
violate-action drop