Perl从字符串读取文件到字符串

时间:2014-09-10 06:06:08

标签: perl filereader

我正在阅读具有此结构的文件:

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);

我尝试了不同的方式,但我仍然无法得到它。

2 个答案:

答案 0 :(得分:4)

你必须使用三个点...范围运算符,因为第二个条件匹配在同一行并且范围立即关闭,

if (/Class <myclass1>/ ... /Class/)

稍后您可以将...视为匹配第二条件/Class/

来自perldoc

  

如果您不希望它在下一次评估之前测试正确的操作数,就像在sed中一样,只需使用三个点(“...”)而不是两个点。在所有其他方面,“......”的行为就像“......”一样。

答案 1 :(得分:0)

使用Range Operator ..有两个细节需要考虑到您的问题:

  1. 如果您不希望范围在下次评估前测试正确的操作数,请使用三点式...

  2. 使用范围的返回值来过滤掉结束条件。

    范围中的最终序列号具有字符串&#34; E0&#34;附加到它,它不会影响其数值,但如果要排除端点,则可以搜索一些内容。

  3. 以下展示:

    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