Perl-提取文件中指定行的数字,并完成替换(包含代码注释)

今天在仿真log中想要把指定行中的数字,替换为使用该数字加工后的数字。

本来log中的这个内容也是UVM环境中打印的,但是没有权限修改那个打印文件。只能处理Log文件了

需求:

读入log文件,在以“m_out_scb.mon[数字]:”开头的行中替换中括号[]中的数字。
run.log

m_out_scb.mon[0]:其他内容

~~~

m_out_scb.mon[10]:其他内容

~~~

m_out_scb.mon[899]:其他内容

中括号中的数字最大值根据仿真数据量来定,上不封顶。

数字的处理:例如0~89处理为0~85一个循环,0~85,0,1,2,3

思路:

1,把文件读入

2,匹配到指定行

3,提取中括号中的数字

4,数字替换为处理后的数字

很久不用perl了,这个功能实现很基础,还是花了些时间,所以记录下来,以后方便参考。

log_process.pl

#!/usr/bin/perl

open my $fh_in,"<","run.log" or die $!    //在当前路径打开run.log作为输入文件,传给fh_in文件句柄
open my $fh_out,">","processed_run.log" or die $!  //在当前路径用processed_run.log来保存处理后的数据

while(<$fh_in>){                              //逐行读取文件内容

    if($_ =~ /^m_out_scb\.mon\[(\d+)\]:.*/){  //$_是perl内置的变量,用于保存读入的当前行内容,如果满足匹配,进入if判断
        $num_get = int($1/85)*85;             //$1是正则匹配中第一个圆括号匹配到的内容,上述匹配中就是中括号内的数字,处理一下这个数字,int是取整操作
        $num     = $1-$num_get;               //按照0~85的循环,得到处理后的数据$num
        $_ =~ s/$1/$num/;                     //在当前行中,替换中括号中的数字为处理后的数字
    }
        print $fh_out $_;                     //无论当前行是否经过处理,都输出当前行内容到processed_run.log中
}

close $fh_out;  //关闭输入文件句柄
close $fh_in;   //关闭输出文件句柄

功能很简单,只是为了使用,也没有写得太严谨。

Perl平时常使用的功能也就是文件读取,匹配指定内容,替换目标内容。这个小功能中都包含了,先记录下来,后面在这个基础上慢慢补充,完善。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值