好的,所以tcl expert(Brad Lanam)在tcl脚本中编写了以下 regexp 和 regsub 命令来解析我的文件格式(称为liberty(.lib))在芯片设计中)。我只是想知道他们的意思(如果不是为什么他们被使用,因为你没有上下文)。我已经使用了tcl wiki上的引用,但似乎无法连接点。这是他的代码片段
set fh [open z.lib r]
set inval false
while { [gets $fh line] >= 0 } {
if { [regexp {\);} $line] } {
set inval false
}
if { [regexp {index_(\d+)} $line all idx] } {
regsub {^[^"]*"} $line {} d
regsub {".*} $d {} d
regsub -all {,} $d {} d
dict set risedata constraints indexes $idx $d
}
if { $inval } {
regsub {^[^"]*"} $line {} d
regsub {".*} $d {} d
regsub -all {[ ,]+} $d { } d
set row [expr {$rcount % 5}]
set column [expr {$rcount / 5}]
set i 0
foreach {v} [split $d { }] {
set c [lindex [dict get $risedata constraints indexes 3] $i]
dict set risedata constraints constraint $c $row $column $v
incr i
}
incr rcount
}
if { [regexp {values} $line] } {
set inval true
set row 0
set rcount 0
}
}
close $fh
特别是,
是什么if { [regexp {index_(\d+)} $line all idx] } {
regsub {^[^"]*"} $line {} d
regsub {".*} $d {} d
regsub -all {,} $d {} d
平均??是否包含\ d +的行搜索多个数字的行变量并匹配字符串行?什么是regsub {^[^"]*"} $line {} d
?
非常感谢帮助像我这样的菜鸟。
参考文献:Brad Lanam
答案 0 :(得分:0)
我将逐行采用并解释它似乎正在做什么。
if { [regexp {index_(\d+)} $line all idx] } {
第一行检查line
中存储的字符串是否包含
一个子串index_
后跟一个或多个数字。如果是这样的话
将匹配的子字符串存储在all
中(其余代码
似乎忽略)并存储变量idx
中找到的数字。
因此,如果line
设置为"stuff index_123 more stuff"
,您就会结束
将all
设置为index_123
并将idx
设置为123
。
regsub {^[^"]*"} $line {} d
此regsub
将从line
开头删除所有内容
包括第一个双引号。它将结果存储在d
。
regsub {".*} $d {} d
下一个regsub
对d
中的值进行操作。它寻找一个
双引号并删除该字符及其后的所有内容,
将结果再次存储在d
。
regsub -all {,} $d {} d
最后,此行删除d
中找到的任何逗号,并存储结果
回到d
。
下一组regexp
/ regsub
行执行类似的一组
除了组中的最后一行之外的操作:
regsub -all {[ ,]+} $d { } d
之前的行删除除了该部分之外的所有内容 一直是双引号,这一行删除任何组成的部分 一个或多个空格和逗号,用单个替换它们 空间。
如果清楚的话,请告诉我。