前言
自诩为多年perl海浮沉的老司机,竟然因为加了一句打印而翻车,这真是万万没有想到,记录一下引以为戒。
事情的由来
在脚本的读取文件里有很多字符串进行处理的时候,定位就会变得困难,比如说我只想打印A的沿路信息,但是直接加打印就会把ABCDE的一大堆信息全打印出来,筛选起来非常的难受。
因此我想到了之前搭环境时候做的一个操作,做一个debug函数在数据流里筛选,符合我需求的(比如说带有ecc error的transaction)报文才会触发debug打印,这种操作在脚本里完全可以照搬一下嘛!
额外感叹一下,最近越来越感觉到我做脚本的思路继承了各种之前搭环境的思路,估计没有几个人写perl的时候还要设置打印等级和最大error数量吧🆒
回归原题,因此我就做了一个简单的筛选机制,简化下的意思就是这样:
my $debug_name = “AA”; … warn “xxxxx” if $name =~ /$debug_name/; • 1 • 2 • 3
也很好理解嘛,某一个变量包含我需要的信息,那就打印一些debug信息给我,如果不包含就pass,写完后我就觉得简直天衣无缝。
翻车事故
我一直这么开心的用着,直到一次我发现,某一处我加了打印后,竟然输出结果跟不加打印完全不一样?!当时我都疯了,倒是见过加一句$display把随机搞乱的情况,脚本里我还真的没见过加打印能影响输出的。
因此仔细的看了下上下文,终于发现了端倪,因为我的代码结构是这样子的:
if($name =~ /…/){ warn “…” if $name =~ /$debug_name/; my $pre = $`; my $post = $’; my $body = $&; … } • 1 • 2 • 3 • 4 • 5 • 6 • 7
问题就出现在下面的取匹配信息上了,本来我要取的是首行if里的匹配结果,结果这样一搞,我取到的是warn行后面的匹配结果,再加上我这里没有使用$1 $2编译没能报错,导致整个匹配处理彻底乱了也没被发现,最终的输出自然各种奇怪的东西。
问题解决
我把打印删了,改用eq ne,嘿高精度打印不搞模糊打印了~~~