微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC后端设计交流 > 大家好,最近遇到一个perl处理Sdc的匹配问题,请高手指点一下。

大家好,最近遇到一个perl处理Sdc的匹配问题,请高手指点一下。

时间:10-02 整理:3721RD 点击:
大家好,最近遇到一个正则匹配的问题,怎么搞都搞不定,请高手指点一下,谢谢啦。
输入文件:以其中一行为例
adad[get_pinssdad{adad/sdad/sadawewe/wew/wewwew/asd}]-dadad[get_clocks ada {saew_sda wea_aa}]dadas[get_pinssdad{adad/sdad/sadawewe/wew/wewwew/asd}]sdada [get_clocks ada {sewew_swea wwe_aa}][get_clocks ada {zzwew_sda efga_aa}]dadsa
要求:
1,把所有get_pins后面 {}内的内容,都加前缀yqx/,(内容之间是用空格分开的)
例如:[get_pinssdad{adad/sdad/sadawewe/wew/wewwew/asd}]
变成[get_pinssdad{yqx/adad/sdad/sadayqx/wewe/wew/wewyqx/wew/asd}]
2,把所有get_clocks 后面 {}内的内容,都加前缀yqx_
例如: [get_clocks ada {sewew_swea wwe_aa}]
[get_clocks ada {yqx_sewew_swea yqx_wwe_aa}]
每行的get_pins 和get_clocks数量不定,后面{}内的参数数量也不确定。但书写规则跟例子中一样,是固定的。
规则是[get_pins xxx {xxx xxx xxx}]
[get_clocks xxx {xxx xxx xxx}]
我希望变成:
[get_pins xxx {yqx/xxx yqx/xxx yqx/xxx}]
[get_clocks xxx {yqx_xxx yqx_xxx yqx_xxx}]

我想请教一下,该如何对完成要求1,2中的替换。谢谢大家了。
我开始是这么实现的:
if (/(\[get_pins.*?)(.*?)\}\]/) {
$change = $2;
$change ~= s/\s/\syqx\//g;
s/(\[get_pins.*?)(.*?)\}\]/$1yqx\/$change\}\]/g;
}
print;
[/code]
但匹配的不对,总是把一行中第一个$2的值,换给了后面所有的get_pins里。
对于get_clocks也是同样情况。
我想请教一下高手,这种替换该如何处理,谢谢大家啦。
上面的例子行,我希望替换完成后是:
adad[get_pinssdad{yqx/adad/sdad/sadayqx/wewe/wew/wewyqx/wew/asd}]-dadad[get_clocks ada {yqx_saew_sda yqx_wea_aa}]dadas[get_pinssdad{yqx/adad/sdad/sadayqx/wewe/wew/wewyqx/wew/asd}]sdada [get_clocks ada {yqx_sewew_swea yqx_wwe_aa}][get_clocks ada {yqx_zzwew_sda yqx_efga_aa}]dadsa

请大家指点一下,非常感谢:)

get_pinssdad{aaaa bbb}也能通过语法么,不行吧, {} 应该是最外面,
但从perl来说,
if (/(\[get_pins.*?)(.*?)\}\]/) {# 这一句写的太模糊了,
$change = $2;
$change ~= s/\s/\syqx\//g;
s/(\[get_pins.*?)(.*?)\}\]/$1yqx\/$change\}\]/g; # 这句看起来累,
}
print;
}
如果是固定的格式,则好办,
比如
if (/get_(?:pin|clock)s\s+(\S+)\s+\{(.*)\}\s*$/ ) {
然后对 $2 处理下, split成单独的元素,然后s/^/yqx/ , 返回,
}
但是问题是 换行问题最麻烦, 最好在一个while 循环里面读行
while ( <> ){
一般的处理,
if ( /\\$/ ){ # 以\ 续行
while( <> ){
$str.= $_ ;
再处理,直到 找到一个匹配的 } 或]为止,
if ( !/\\$/ ){# exit this loop ,此行结束了
next ;
}
}

或者一次性全读入,然后split成一句一句tcl,
比如 my $data =<FILE>
my @tcl =split/(?!\\)\n/ , $data ;
就是按\n split,但是\\结尾的 除外,
然后再对 @tcl每个元素进行处理,

谢谢小编。
这下思路好多了。
我老用正则套,太麻烦。
打散之后,好处理多了:)

正则可以写的 具体写,这样匹配的更准

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top