如何使用参数扩展定义变量

时间:2014-05-19 19:26:15

标签: tcl

以下命令按预期运行:

lappend {*}{arr 1}
puts [lindex $arr 0]

现在我正在尝试制作一个变量" {*} {arr 1}"像这样:

set X "{*}{arr 1}"
lappend $X

但这不起作用,似乎$ X被视为一个整体值,参数扩展无效。

因此要求参数扩展不能通过变量吗?

2 个答案:

答案 0 :(得分:3)

{*}是Tcl的语法特征(从Tcl 8.5开始),就像[ ... ]" ... "或{{1是的。你必须在脚本中写它才能算作参数扩展;否则它只是一个由三个字符组成的序列。

如果你想要像

这样的东西
$

要工作,您需要通过set X "{*}{arr 1}" lappend $X

传递
eval

请注意,这意味着set X "{*}{arr 1}" eval lappend $X 实际上包含一个脚本片段;这可能会产生各种“有趣”的后果。试试这个尺寸:

X

在现代Tcl中使用set X "{*}{arr 1};puts hiya" eval lappend $X 通常表明你会以错误的方式处理事情;旧脚本中的关键用途是执行类似于我们现在使用eval的操作。

答案 1 :(得分:1)

不,在双引号内,{}实际上已失去意义,{*}也将失去意义。请注意,puts "{}"puts {}不同。

我能想到的最接近你要做的事情就是使用这样的东西:

set X {arr 1}
lappend {*}$X

因此,如果您现在执行puts [lindex $arr 0],则会获得1作为输出。