为什么" expr $"在tcl8.4中有效吗?

时间:2016-11-09 03:14:25

标签: tcl

这源于On tcl tests - how to interpret tcltest::test

这是来自TCL8.4手册页:

  

[7] 变量替换。
      如果一个单词包含一个美元符号(“$”),后跟下面描述的一种形式,则Tcl执行变量替换:美元符号和后面的字符在单词中被替换为a的值变量。变量替换可以采用以下任何一种形式:

     

$name
       Name 是标量变量的名称;名称是一个或多个字符的序列,它们是字母,数字,下划线或命名空间分隔符(两个或多个冒号)。

因此,单个$不包含字母,数字,下划线或冒号等字符应该是语法错误。

或者它实际上是一个TCL解析器错误,但因为没有这样的真实世界脚本,所以我们侥幸逃脱它?

对不起,如果我看起来疯狂挑剔,只是想了解。

1 个答案:

答案 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)

相关问题