1

我的问题更多的是优化问题,而不是“howto”。
我有一个 lef 文件,有数千行,格式如下:

RECT 429.336 273.821 426.246 274.721 ;

我想使用单线将所有矩形向左移动 4 um:

perl -lane '$F[2] > 1200 ? print $F[0]," ", ($F[1] - 4)," ", $F[2]," ", ($F[3] -4)," ", $F[4], " ;" : print $_' trial.lef

事情是,这很丑陋
有没有更好的方法来编辑文件?

我不挑剔,很乐意用其他语言(awk、sed 等)得到答案,只要它们比我写的更好。

附加输入:

      LAYER M12 ;
        RECT 0 411.214 1 412.214 ; <-- shouldn't change, because 411.214 < 1200
    END
  END kuku_pin
  PIN gaga_pin
    DIRECTION OUTPUT ;
    USE SIGNAL ;
    PORT
      LAYER M11 ;
        RECT 43.1045 1203.138 43.1805 1207.29 ; <-- should change to "RECT 39.1045 1203.138 39.1805 1207.29"
    END
4

1 回答 1

3

确实没有太大的改进空间,但是您可以替换-n-p跳过额外的print。此外,您可以编辑数组元素并使用join更漂亮的代码:

perl -lape'if ($F[2] > 1200) { $F[1] -= 4; $F[3] -= 4; $_ = join " ", @F }'
  • -a自动拆分模式,在空间上拆分行$_并将值放入预定义的@F数组中。此开关与-n或一起使用-p
  • -p<>围绕操作符输入、文件或标准输入循环
  • -=按 RHS 的数量减少 LHS
  • join数学完成后重新加入线
  • -l在这种情况下可以跳过,因为我们从不触及行尾,但是如果我们决定编辑最后一个字段,保持它会使代码更加灵活。

当条件不满足时,原行不变打印。否则,它将替换为 中的连接值@F

如果您决定保留前导空格,然后RECT您可以将您的 if 语句用

if (($pre) = /^(\s*RECT)/)

要存储行的开头,制作单行:

perl -lape'if (($pre) = /^(\s*RECT)/) { if ($F[2] > 1200) { $F[1] -= 4; $F[3] -= 4; $F[0] = $pre; $_ = join " ", @F }}'
于 2021-07-25T15:17:22.310 回答