一次有趣的遭遇:
set v "\{a b\}"
expr $v eq \{a b\}
表达式命令按预期返回true。但以下也会返回true:
set v "\{a b\}"
expr $v eq \{a b\}
基本上,\{a
和b\}
之间的空格数会被忽略。
我知道TCL表达式应该支持参数。
我知道没有人会认真编写这样的代码。
我还可以猜测发生了什么:
expr
时,它无法访问" raw"脚本,它只知道有两个单词,{a
和b}
,由一些空格分隔但从TCL作为编程语言的角度来看,这是一个错误吗?
答案 0 :(得分:2)
Tcl语法的第三条规则是
命令的单词由空格分隔(换行符除外, 这是命令分隔符。)
(命令名和参数字符串是单词。)
expr
文档中的第一个条款是
连接args(在它们之间添加分隔符空格)
所以会发生的事情是Tcl解析器将字符串expr $v eq \{a b\}
分成五个单词,丢弃它们之间的空白字符。然后expr
命令将其四个参数连接成一个字符串,每对之间有一个分隔符空格。
与您在字符串上执行list mutation命令时看到的基本相同:
% set a {a b c}
a b c
% lappend a d
a b c d