如果指定了-nobackslashes、-nocommands或-novariables标志位,那么相应的替换将不会执行,比如如果指定了-nocommands标志位,命令替换就不会发生,中括号被当作为普通字符处理。
注意一种替换可以包含其他类型的替换,比如,当指定-novariables标志位,命令替换将会执行,这意味着任何完成命令需要进行的变量替换依然会发生。同样的,即使指定了-nocommands命令,任何完成变量替换需要进行的命令替换也会发生。
如果在替换的过程中发生错误,subst命令返回错误。如果一个在命令替换或变量替换时发生break异常,替换返回的结果就是出现异常发生之前已经替换成功的字符串,如果一个在命令替换或变量替换时发生continue异常,这部分命令替换将返回一个空字符串,然后它之前和之后替换的字符串一起返回。如果一个在命令替换或变量替换时返回一个return异常,这部分命令替换将返回return返回的代码,然后它之前和之后替换的字符串一起返回。
set a 44 subst {xyz {$a}}返回xyz {44}而不是xyz {$a},脚本:
set a "p/} q /{r" subst {xyz {$a}}返回xyz {p} q {r}而不是xyz {p/} q /{r}
当命令替换执行时,它包含的任何变量替换都回执行:
set a 44 subst -novariables {$a [format $a]}返回$a 44而不是$a $a,相似的,当变量替换执行时,它包含的任何命令替换都会执行:
proc b {} {return c} array set a {c c [b] tricky} subst -nocommands {[b] $a([b])}返回[b] c而不是[b] tricky
continue和break异常允许命令替换去防止余下的替换:
subst {abc,[break],def}返回abc,而不是abc,,def,脚本:
subst {abc,[continue;expr {1+2}],def}返回abc,,def,而不是abc,3,def
其它异常返回的代码替代返回值:
subst {abc,[return foo;expr {1+2}],def}返回abc,foo,def而不是abc,3,def
subst {abc,[return -code 10 foo;expr {1+2}],def}也返回abc,foo,def而不是abc,3,def