今天在仿真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平时常使用的功能也就是文件读取,匹配指定内容,替换目标内容。这个小功能中都包含了,先记录下来,后面在这个基础上慢慢补充,完善。