我在 TCL 中声明一个数组说
set JDSU-12-1(key) element
parray JDSU-12-1
我收到错误消息说 JDSU 不是数组
即使是简单的 puts 语句也不起作用
% puts $JDSU-12-1(key)
can't read "JDSU": no such variable
有什么办法可以用连字符声明数组名称。我知道 _ 在数组中有效,但不确定连字符
我在 TCL 中声明一个数组说
set JDSU-12-1(key) element
parray JDSU-12-1
我收到错误消息说 JDSU 不是数组
即使是简单的 puts 语句也不起作用
% puts $JDSU-12-1(key)
can't read "JDSU": no such variable
有什么办法可以用连字符声明数组名称。我知道 _ 在数组中有效,但不确定连字符
您可以在 Tcl 变量名中使用特殊字符。不过,您需要这些大括号:
% puts ${JDSU-12-1(key)}
element
你甚至可以使用$
:
% set \$word "Hello world" ;# Or set {$word} "Hello world"
% puts ${$word}
Hello world
编辑:一些参考:
beedub.com(重点是我的)
set 命令用于为变量赋值。它有两个参数:第一个是变量的名称,第二个是值。变量名可以是任意长度,并且大小写很重要。事实上,您可以在变量名中使用任何字符。
虽然可以使用这样的特殊字符,但在尝试使用$varname
.
引用手册中的相关部分:
$
姓名Name是标量变量的名称;名称是一个或多个字符的序列,它们是字母、数字、下划线或命名空间分隔符(两个或多个冒号)。字母和数字只是标准的 ASCII 字符(
0-9
和A-Z
)a-z
。
$
名称(
索引)
Name给出了数组变量的名称, index 给出了该数组中元素的名称。名称只能包含字母、数字、下划线和命名空间分隔符,并且可以是空字符串。字母和数字只是标准的 ASCII 字符(
0-9
和A-Z
)a-z
。对 index 的字符执行命令替换、变量替换和反斜杠替换。
${
姓名}
Name 是标量变量或数组元素的名称。它可以包含除右括号之外的任何字符。如果 name 的格式为“<em>arrayName( index )”,其中 arrayName 不包含任何左括号字符“<code>(”或右大括号字符“<code>}”,则表示数组元素,并且index 可以是除右括号字符之外的任何字符序列。在解析名称期间不会执行进一步的替换。
一个单词中可能有任意数量的变量替换。不对大括号中的单词执行变量替换。
请注意,变量可能包含上面列出的字符序列以外的字符序列,但在这种情况下,必须使用其他机制来访问它们(例如,通过set命令的单参数形式)。
我想同情最后一段:
您始终可以使用以下命令读取任何变量set varname
:
set JDSU-12-1(key) element
puts [set JDSU-12-1(key)]
与${varname}
访问不同,您可以替换变量名称的一部分(在您的情况下为数组键),整个变量,而set k "key"; puts ${JDSU-12-1($k)}
不起作用。
在 Tcl 中,您几乎可以使用任何字符作为变量的名称——唯一的限制与::
命名空间分隔符有关,因为(
它用于数组——但$
语法更具限制性;它接受的名称(不使用${…}
表单)必须仅包含 ASCII 字母、ASCII 数字、下划线或命名空间分隔符。破折号不在该列表中。
从具有“怪异”名称的变量中读取的标准(也是最简单的)方法是set
仅使用一个参数,因为它完全可以接受任何合法的变量名称:
puts "the element is '[set JDSU-12-1(key)]'"
但是,如果您经常这样做,实际上更容易为(数组)变量名创建别名:
upvar 0 JDSU-12-1 theArray
puts "the element is $theArray(key)"
这正是parray
它的作用,尽管它使用upvar 1
它是因为它是调用范围内的变量而不是当前范围内的变量的别名。
您可以轻松地做到这一点:
访问时设置 set-var "test" ${set-var}
与大多数其他编程语言一样,TCL 变量必须是以字母(A
toZ
或_
)开头的字母数字。连字符或破折号 ( -
) 不允许作为变量名的一部分,否则它会与算术减法或减法混淆:$x-1
作为带有名称的变量"x-1"
或$x-1
作为变量x
减法之间没有区别1
。
尝试这个 :)
subst $\{[subst ${conn}](phan)\}
你用的是哪个版本??我的 tcl 工作。
% set JDSU-12-1(key) element
element
% parray JDSU-12-1
JDSU-12-1(key) = element