【问题标题】:Printing multiple variables in tcl在 tcl 中打印多个变量
【发布时间】:2014-07-03 04:08:30
【问题描述】:

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

puts "$n1_$n2_$n3_$n4"

其中n1n2n3n4 是 4 个变量。

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

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

01_abc_21_akdd

【问题讨论】:

  • 知道了:我尝试在每个 _ 之前加上 \ 并且成功了。像这样:puts "$n1\_$n2\_$n3\_$n4

标签: tcl puts


【解决方案1】:

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

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

但是如果您有一个名为abc 的变量并使用$abcd$abc_d,那么引擎将开始寻找变量abcdabc_d @ 987654333@.

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

${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
    

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

【讨论】:

    【解决方案2】:

    另外两种方式:

    puts "${n1}_${n2}_${n3}_${n4}"
    
    puts [format "%s_%s_%s_%s" $n1 $n2 $n3 $n4]
    

    文档:format

    (注意:Jerry 的回答中提到的“Hoodiecrow”是我,我之前用过这个昵称。)

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 2016-06-23
      相关资源
      最近更新 更多