perl实现,匹配并打印一个段落

有一个应用场景,实现后,觉得还是记录下来。以后还会遇到的。

举例

根据## ==这样的行,匹配并打印该段落范围的所有行。
另外一点,打印出的内容,只允许存在max最大值和min最小值。

########
## sdsdfsdf
## 1123123
########
## ======== 1sdfs ======
## ====== 2saas ======
max 0.2323
max 0.2423
max 0.2343
max 0.2313
max 0.2300
max 0.2323
min 0.1221
## ====== 3ss ======
max 1.2323
max 1.2423
max 1.2343
max 1.2313
max 1.2300
max 1.2323
## ====== 3ss ======
min 2.2323
min 2.2423
min 2.2343
min 2.2313
min 2.2300
min 2.2323
## =====
## =====
#
###

perl代码

#!/usr/bin/perl
use strict;
use warnings;
my $debug=1;

open my $filei, "<", "$ARGV[0]" or die "file?";
my @max=();
my @min=();
my $line=0;

while(<$filei>){
    if($_ =~ /^## ====/){
        $line=$.;
        @max=sort(@max) if defined($max[0]);
        print "max $max[$#max]\n" if defined($max[0]);
        @min=sort(@min) if defined($min[0]);
        print "min $min[0]\n" if defined($min[0]);
        print $_;
        @max=();
        @min=();
    }
    elsif($_ =~ /^max\s+([0-9]+\.*[0-9]*)/){
        if($. > $line){
            push @max,$1;
        }
    }
    elsif($_ =~ /^min\s+([0-9]+\.*[0-9]*)/){
        if($. > $line){
            push @min,$1;
        }
    }
    else{
        print $_;
    }
}


close $filei;

__END__
1. 定义数组
my @max=();
和
my @max=undef;
竟然不是一回事。
在push @max,"ssss"命令之后,
第一种写法的$max[0]="ssss"
第二种写法的$max[0]是undef,$max[1]="ssss"

执行结果如下:

########
## sdsdfsdf
## 1123123
########
## ======== 1sdfs ======
## ====== 2saas ======
max 0.2423
min 0.1221
## ====== 3ss ======
max 1.2423
## ====== 3ss ======
min 2.2300
## =====
## =====
#
###

猜你喜欢

转载自blog.csdn.net/u011729865/article/details/79080536
今日推荐