了解大括号的用法

jac*_*ser 19 tcl

我正在学习Tcl/Tk,并对tcl中花括号的使用感到困惑.

对我来说它似乎用于指示范围和声明字符串!这是一个错误(或功能)?

我的解释是否正确?

gle*_*man 28

简而言之,

  • Tcl的大括号就像sh的单引号 - 没有插值的组词(和行).
  • Tcl的双引号就像sh的双引号 - 允许插值.

proc定义中使用花括号的事实不是强制性的.这是将脚本作为参数传递给proc而不进行插值的最方便的方法.

这些是等价的

proc add3 {a b c} {
    return [expr {$a + $b + $c}]
}
Run Code Online (Sandbox Code Playgroud)

proc add3_weird [list a b c] "return \[expr {\[set a] + \[set b] + \[set c]}]"
Run Code Online (Sandbox Code Playgroud)

一旦你内化了Tcl引用,你就会意识到Tcl的真正灵活性.

  • 如果在答案中不清楚,插值意味着将发生替换.如果你有一个名为myvar ="some string"的变量,那么{a $ myvar b}将导致字符串文字"a $ myvar b"...而"a $ myvar b"将导致字符串文字"a一些字符串b" (4认同)
  • 我喜欢说"当你需要使用花括号时,你只需要使用花括号",这意味着 - 与大多数语言不同,花括号仅*用于引用.语言中没有任何东西需要你使用花括号.它们是引用机制,您可以选择使用或不使用.当然,最好的做法是说使用它们的时候是明智的...... (3认同)
  • 我可以理解"index","$ index","{index}"和"{$ index}".我最近遇到了"$ {index}"并且是......哇?!最终可以解析,但为什么要这样写呢? (2认同)

MrP*_*tic 5

在回答Toddius Zho的评论时,我已经看到了几个问题(并让我感到自己):在使用变量(例如$ {var})时为什么使用花括号

在TCL中,标准标量变量可以包含任何字符。但是,变量替换运算符“ $”假定您使用字母数字字符和下划线(加上名称空间分隔符“ ::”)

因此,如果将变量设置为非字母数字字符,例如“!”,则在尝试替换该变量时,TCL将出错。

% set myvar! 123
123
% puts $myvar!
can't read "myvar": no such variable
Run Code Online (Sandbox Code Playgroud)

使用大括号替代运算符不会出错:

% set myvar! 123
123
%puts ${myvar!}
123
Run Code Online (Sandbox Code Playgroud)

这是因为TCL不会对花括号内定义的任何内容执行替换/插值。

http://www.tcl.tk/man/tcl8.5/TclCmd/Tcl.htm