puts
我必须像这样打印多个变量
puts "$n1_$n2_$n3_$n4"
其中n1
, n2
, n3
,n4
是 4 个变量。
它不会打印并会显示错误n1_ : no such variable
预期的输出应该是这样的(示例)
01_abc_21_akdd
Tcl 中的变量名可以是 Tcl 中的任何字符串,没有限制,但如果你想使用特殊字符(那些不在 , 和 , 范围内的字符a-z
,0-9
以及_
不同语言中的字母,取决于平台和语言环境),你必须要么支持表达式名称或使用其他解决方法(如 Hoodiecrow 的答案)。
这意味着如果您有一个名为 的变量abc.d
,并且如果您使用$abc.d
,Tcl 引擎将尝试查找该变量$abc
,因为.
它不是一个“正常”字符。
但是,如果您有一个名为abc
并使用$abcd
or的变量$abc_d
,那么引擎将开始查找变量abcd
orabc_d
而不是 abc
。
因此,您必须在变量名之间使用大括号,例如:
${n1}
放置反斜杠的原因是它\
不是一个“正常”的字符,在阅读了上面的内容之后,应该更清楚事情是如何工作的。
有一些东西可以放在不需要大括号的变量名中,但仍然意味着某些东西,除了某些东西是“特殊的”:
::
: 这通常用于范围界定。例如,如果您有一个名为 的全局变量my_var
,您也可以使用$::my_var
来引用它。这里::
告诉 Tcl 这my_var
是一个全局变量。请注意,如果连续有两个以上,则:
它们不会相加:
% set ::y 5
5
% set ::::y
5
% set :::y
5
::
通常用于定义变量所在的命名空间。例如,$mine::var
是在命名空间中调用的变量var
,名称为mine
.
()
: 这些用于数组。$arr(key)
是一个包含两部分的变量:数组名arr
和键名key
。注意:您可以有一个命名的数组和一个命名的键
,因为...
% set () abc
abc
% puts $()
abc
% array get ""
{} abc
可能还有更多,但这些是您可以关注的基础知识。
Two other ways:
puts "${n1}_${n2}_${n3}_${n4}"
puts [format "%s_%s_%s_%s" $n1 $n2 $n3 $n4]
Documentation: format
(Note: the 'Hoodiecrow' mentioned in Jerry's answer is me, I used that nick earlier.)