0

puts我必须像这样打印多个变量

puts "$n1_$n2_$n3_$n4"

其中n1, n2, n3,n4是 4 个变量。

它不会打印并会显示错误n1_ : no such variable

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

01_abc_21_akdd
4

2 回答 2

1

Tcl 中的变量名可以是 Tcl 中的任何字符串,没有限制,但如果你想使用特殊字符(那些不在 , 和 , 范围内的字符a-z0-9以及_不同语言中的字母,取决于平台和语言环境),你必须要么支持表达式名称或使用其他解决方法(如 Hoodiecrow 的答案)。

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

但是,如果您有一个名为abc并使用$abcdor的变量$abc_d,那么引擎将开始查找变量abcdorabc_d不是 abc

因此,您必须在变量名之间使用大括号,例如:

${n1}

放置反斜杠的原因是它\不是一个“正常”的字符,在阅读了上面的内容之后,应该更清楚事情是如何工作的。


有一些东西可以放在不需要大括号的变量名中,但仍然意味着某些东西,除了某些东西是“特殊的”:

  1. ::: 这通常用于范围界定。例如,如果您有一个名为 的全局变量my_var,您也可以使用$::my_var来引用它。这里::告诉 Tcl 这my_var是一个全局变量。请注意,如果连续有两个以上,则:它们不会相加:

    % set ::y 5
    5
    % set ::::y
    5
    % set :::y
    5
    

    ::通常用于定义变量所在的命名空间。例如,$mine::var是在命名空间中调用的变量var,名称为mine.

  2. (): 这些用于数组。$arr(key)是一个包含两部分的变量:数组名arr和键名key。注意:您可以有一个命名的数组和一个命名的键,因为...

    % set () abc
    abc
    % puts $()
    abc
    % array get ""
    {} abc
    

可能还有更多,但这些是您可以关注的基础知识。

于 2014-07-03T05:34:29.350 回答
0

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.)

于 2014-07-03T05:03:47.723 回答