在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 9188|回复: 3

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

[复制链接]
发表于 2011-11-25 12:24:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
大家好,最近遇到一个正则匹配的问题,怎么搞都搞不定,请高手指点一下,谢谢啦。

输入文件:以其中一行为例
adad  [get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]  -dadad  [get_clocks ada {saew_sda wea_aa}]  dadas   [get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]  sdada [get_clocks ada {sewew_swea wwe_aa}]   [get_clocks ada {zzwew_sda efga_aa}]  dadsa

要求:
1,把所有get_pins  后面 {}内的内容,都加前缀yqx/,(内容之间是用空格分开的)
例如:[get_pins  sdad  {adad/sdad/sada  wewe/wew/wew  wew/asd}]
变成  [get_pins  sdad  {yqx/adad/sdad/sada  yqx/wewe/wew/wew  yqx/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_pins  sdad  {yqx/adad/sdad/sada  yqx/wewe/wew/wew  yqx/wew/asd}]  -dadad  [get_clocks ada {yqx_saew_sda yqx_wea_aa}]  dadas   [get_pins  sdad  {yqx/adad/sdad/sada  yqx/wewe/wew/wew  yqx/wew/asd}]  sdada [get_clocks ada {yqx_sewew_swea yqx_wwe_aa}]   [get_clocks ada {yqx_zzwew_sda yqx_efga_aa}]  dadsa


请大家指点一下,非常感谢:)
发表于 2011-11-25 13:47:48 | 显示全部楼层
get_pins  sdad  {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每个元素进行处理,
 楼主| 发表于 2011-11-25 15:08:32 | 显示全部楼层
谢谢楼主。
这下思路好多了。
我老用正则套,太麻烦。
打散之后,好处理多了:)
发表于 2011-11-25 18:03:04 | 显示全部楼层
正则可以写的 具体写,  这样匹配的更准
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 22:58 , Processed in 0.020666 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表