【问题标题】:Why is "expr $" valid in tcl8.4?为什么“expr $”在 tcl8.4 中有效?
【发布时间】:2016-11-09 03:14:24
【问题描述】:

这来自On tcl tests - how to interpret tcltest::test

这里来自 TCL8.4 手册页:

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

<b>$</b><i>name</i>
Name 是标量变量的名称;名称是一个或多个字符的序列,可以是字母、数字、下划线或命名空间分隔符(两个或多个冒号)。

因此,没有字母、数字、下划线或冒号等字符的单个 $ 应该是语法错误。

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

对不起,如果我看起来很挑剔,只是想了解一下。

【问题讨论】:

  • 该手册页是令人难以置信 rules-lawyer-y。如果它没有它是一个错误,它不是一个错误并且默认只是没有什么特别的。

标签: tcl


【解决方案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)

【讨论】:

  • 需要注意的是,虽然 tcl 只有 13 条语法规则,但规则非常准确。我的意思是数学意义上的“准确”——每个定义的每个词都有意义。很多 tcl 的行为是涌现出来的——它们是通过规则之间的交互而不是自己指定的而出现的。
猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 2018-11-04
  • 2013-12-25
  • 2010-12-23
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多