这源于On tcl tests - how to interpret tcltest::test。
这是来自TCL8.4手册页:
[7] 变量替换。
如果一个单词包含一个美元符号(“$
”),后跟下面描述的一种形式,则Tcl执行变量替换:美元符号和后面的字符在单词中被替换为a的值变量。变量替换可以采用以下任何一种形式:
$name
Name 是标量变量的名称;名称是一个或多个字符的序列,它们是字母,数字,下划线或命名空间分隔符(两个或多个冒号)。
因此,单个$
不包含字母,数字,下划线或冒号等字符应该是语法错误。
或者它实际上是一个TCL解析器错误,但因为没有这样的真实世界脚本,所以我们侥幸逃脱它?
对不起,如果我看起来疯狂挑剔,只是想了解。
答案 0 :(得分:1)
请注意变量替换规则的措辞:
如果某个字词包含美元符号(“$”),后跟下面描述的其中一种形式
这特别意味着,如果一个单词包含$
但后面没有变量名称的有效表单,则它只是文字字符$
,因为没有替换发生了。再次注意,我小心地加上“替换”这个词。
在tcl中,$
规则不是用于标识Perl或PHP中的变量的规则。将一个字符串替换为另一个字符串是一个规则(将其视为简化的s/var/value/
运算符)。
您可以尝试以下方法:
set foo hello
puts $foo // prints hello
puts hello$foo // prints hellohello (note the "contains" wording of the rule)
puts $ // prints $
puts hello$ // prints hello$
puts hello$hello // errors out about $hello not existing
单独$
不是语法错误。
改变的可能是表达式解析器。但是为此您不参考替换规则,您需要阅读expr
的手册页(我已经阅读了8.4和8.6手册页,并且没有关于裸字符串的内容,所以它可能是前一个错误8.6版本的expr)