使用Tcl中的正则表达式将变量传递给命令

时间:2017-06-29 22:54:37

标签: regex parsing arguments tcl parameter-passing

我正在尝试将变量传递给我的正则表达式,以便在循环遍历字符串列表时使用。例如,我有一个字符串,它是: top/inst/name[i],其中i可以采用不同的整数值。

for {set i 0} {$i < $rows} {set i [expr {$i + 1}]} {
    my_command { top/inst/name[$i] top_o/inst_o/name[$i] }
}

如何告诉正则表达式解析器将$i视为数字?它抱怨$i是一个命令。

1 个答案:

答案 0 :(得分:2)

问题是[ ... ]在这里有两个不同的目的,一个在基本Tcl中作为命令替换语法,一个用于正则表达式作为字符集语法。鉴于括号似乎是某些内容的实际名称的一部分,我现在还不确定您是否希望 。所以你需要小心。

要避免命令替换,您可以在\[之前插入]个字符,也可以使用subst的扩展功能:

    my_command [subst -nocommands { top/inst/name[$i] top_o/inst_o/name[$i] }]

为了避免其他问题,您可以插入更多反斜杠(请注意,这可能会让事情在一段时间后变得难看)或者您是否真的使用正则表达式来匹配文字(子)在字符串中,您可以使用***=为正则表达式添加前缀。

incr i循环迭代子句中使用set i [expr {$i + 1}]而不是for是惯用的。它做同样的事情,但对于(人类)读者来说更短更清晰。它就像在C或C ++(或许多其他语言)中使用++i而不是i = i + 1一样。