应用背景
在用perl语言生成文件时,有时会碰到需要对文件的最后一行进行特殊处理,这个时候可以利用perl语言中的seek()函数和tell()函数配合来完成。
实例应用
问题描述
下面是用verilog语言描述的信号连线信息,其中1-4行都是以逗号结尾,只有最后一行是以右括号+分号结尾。如何用perl脚本自动实现该效果呢?
1 .i_signalA(c_signalA),
2 .i_signalB(c_signalB),
3 .i_signalC(c_signalC),
4 .i_signalD(c_signalD),
5 .i_signalE(c_signalE));
解决方案
- 首先使用perl语言的print函数生成格式统一的代码,
print($FH,"\.i_$1\(c_$1),\n");
其中,$1是用perl正则表达式捕获的信号名,对应图1中的signalA,signalB,...
打印的信息如下图所示:
1 .i_signalA(c_signalA),
2 .i_signalB(c_signalB),
3 .i_signalC(c_signalC),
4 .i_signalD(c_signalD),
5 .i_signalE(c_signalE),
2.此时文件句柄$FH位置指向第5行的逗号后面的换行符\n的下一个字符,可以用tell函数获取此位置:
$pos=tell($FH);
- 将文件句柄的位置重新指向第5行的逗号,然后重新输出右括号、分号、换行符(\n):
$new_pos=$pos - 2;# 文件句柄左移两个字节
seek($FH,$new_pos,0);
print($FH,"\);\n");
经过上面三个步骤,就可以实现用脚本自动对最后一行进行处理的功能^_^