我正在使用frink 2.2.2p4来清理旧版TCL代码,并提供静态检查。
它在有效的TCL语法上失败:
set foo [regsub {regex} $var {sub}]
错误消息是:
在调用regsub时缺少“变量”部分
我可以通过将代码更改为:
来绕过此错误set foo [regsub {regex} $var {sub} junk]
但是,这会破坏我的代码(foo不再正确设置)
这是frink的已知问题吗?
答案 0 :(得分:3)
这是frink的问题。替换后的另一个单词的regsub
语法(这是一个用于将替换字符串写入的变量名称)是Tcl用来始终执行regsub
的方式,但是多年前就改变了(我提交了更改)在according to the logs的2002 change request中,当很明显大多数人并不真正关心大部分时间进行了多少次替换的计数时。看起来像frink从未更新过。
如果您仍然要使用frink(而不是使用维护的nagelfar,虽然这有点不同),那么您应该像regsub
那样写# Old fashioned syntax
regsub {regex} $var {sub} foo
这样:
# Tcl 8.4 or later syntax
set foo [regsub {regex} $var {sub}]
而不是:
while
请注意,旧式语法不会消失!在一些情况下,替换计数是有用的(例如剥离嵌套括号时,其中计数良好作为{{1}}循环的条件)。
答案 1 :(得分:0)
我找到了使用vi / sed的解决方法 替换增加了一个"垃圾"变量到每个regsub的末尾:
:%s/\(\[regsub.*["}].*\)\]/\1 junkk/g
:%s/\(\[regsub.*\$\S\+\)\]/\1 junkk/g
如果最后一个字段为" var"则第一个替换适用或{var}
如果最后一个字段是$ var
保存文件并运行frink。
~/bin/frink -enNU -w 250 script.tn > script_clean.tn
之后,将相同的替换恢复为script_clean.tn:
:%s/ junkk//g
这对我很有用。
同样的技术也解决了我对此错误消息的类似问题:
错误:缺少"变量名称"参与upvar的调用