在tcl中打印多个变量

在tcl中打印多个变量,tcl,puts,Tcl,Puts,我必须像这样在一个文件中打印多个变量 puts "$n1_$n2_$n3_$n4" 其中,n1,n2,n3,n4是4个变量 它不会打印,并将显示错误n1\u1:没有这样的变量 预期输出应该是这样的(示例) 其他两种方式: puts "${n1}_${n2}_${n3}_${n4}" puts [format "%s_%s_%s_%s" $n1 $n2 $n3 $n4] 文件: (注意:Jerry回答中提到的“Hoodiecrow”是我,我在前面使用了nick。)Tcl中的变量名可以是Tcl

我必须像这样在一个
文件中打印多个变量

puts "$n1_$n2_$n3_$n4"
其中,
n1
n2
n3
n4
是4个变量

它不会打印,并将显示错误
n1\u1:没有这样的变量

预期输出应该是这样的(示例)

其他两种方式:

puts "${n1}_${n2}_${n3}_${n4}"

puts [format "%s_%s_%s_%s" $n1 $n2 $n3 $n4]
文件:


(注意:Jerry回答中提到的“Hoodiecrow”是我,我在前面使用了nick。)

Tcl中的变量名可以是Tcl中的任何字符串,没有任何限制,但如果您想使用特殊字符(那些不在
a-z
0-9
范围内的字母,以及不同语言的字母,具体取决于平台和语言环境),您必须要么用括号括住表达式名称,要么使用其他变通方法(如Hoodiecrow的答案)

这意味着,如果您有一个名为
abc.d
的变量,并且使用
$abc.d
,Tcl引擎将尝试查找该变量
$abc
,因为
不是“正常”字符

但是,如果您有一个名为
abc
的变量并使用
$abc
$abc\u d
,则引擎将开始查找变量
abc
abc\u 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
    

  • 可能还有一些,但这些是你可以注意的基础。

    明白了:我试着在每个
    之前放\并且成功了。就像这样:
    放“$n1\\u$n2\\u$n3\\u$n4
    % set () abc
    abc
    % puts $()
    abc
    % array get ""
    {} abc