我们能在TCL中用连字符给出数组名吗
我在TCL say中声明一个数组我们能在TCL中用连字符给出数组名吗,tcl,Tcl,我在TCL say中声明一个数组 set JDSU-12-1(key) element parray JDSU-12-1 我错误地说JDSU不是数组 即使是简单的puts语句也不起作用 % puts $JDSU-12-1(key) can't read "JDSU": no such variable 有没有办法用连字符声明数组名。我知道uu可以在数组中工作,但不确定连字符是否可以与大多数其他编程语言一样,TCL变量必须是以字母开头的字母数字(A到Z,或)。不允许连字符或破折号(-)作为变量
set JDSU-12-1(key) element
parray JDSU-12-1
我错误地说JDSU不是数组
即使是简单的puts语句也不起作用
% puts $JDSU-12-1(key)
can't read "JDSU": no such variable
有没有办法用连字符声明数组名。我知道uu可以在数组中工作,但不确定连字符是否可以与大多数其他编程语言一样,TCL变量必须是以字母开头的字母数字(
A
到Z
,或
)。不允许连字符或破折号(-
)作为变量名的一部分,否则它将与算术减号或减法相混淆:将$x-1
作为变量与名为“x-1”
或$x-1
作为变量x
减号1
之间没有区别。试试这个:)
您可以在Tcl变量名中使用特殊字符。但是,您需要这些支架:
% puts ${JDSU-12-1(key)}
element
您甚至可以使用$
:
% set \$word "Hello world" ;# Or set {$word} "Hello world"
% puts ${$word}
Hello world
编辑:一些参考:
(强调矿山)
set命令用于为变量赋值。它有两个参数:第一个是变量的名称,第二个是值变量名可以是任意长度,大小写重要。事实上,您可以在变量名中使用任何字符。
你正在使用哪个版本?? 我的tcl工作
% set JDSU-12-1(key) element
element
% parray JDSU-12-1
JDSU-12-1(key) = element
虽然可以使用这些特殊字符,但在尝试使用
$varname
访问变量时,只能使用少数字符
引用以下文件中的相关章节:
$
名称
Name是标量变量的名称;名称是一个或多个字符的序列,这些字符是字母、数字、下划线或命名空间分隔符(两个或多个冒号)。字母和数字仅为标准ASCII字符(0-9
、A-Z
和A-Z
)
$
名称(
索引)
Name给出数组变量的名称,index给出该数组中元素的名称。名称必须仅包含字母、数字、下划线和命名空间分隔符,并且可以是空字符串。字母和数字仅为标准ASCII字符(0-9
、A-Z
和A-Z
)。对索引的字符执行命令替换、变量替换和反斜杠替换
${
name}
Name是标量变量或数组元素的名称。它可以包含除大括号外的任何字符。如果名称的格式为“arrayName(index)”,其中arrayName不包含任何开括号字符,“(
”,或右大括号字符,“}
”,则表示数组元素,和索引可以是除大括号字符以外的任何字符序列。在名称解析过程中不执行进一步的替换
单个单词中可以有任意数量的变量替换。在大括号中的单词上不执行变量替换
请注意,变量可能包含上面列出的字符序列以外的字符序列,但在这种情况下,必须使用其他机制来访问它们(例如,通过命令的单参数形式)
我想谈谈最后一段:
使用设置varname
始终可以读取任何变量:
set JDSU-12-1(key) element
puts [set JDSU-12-1(key)]
与
${varname}
访问不同,您可以替换变量名的一部分(在本例中是数组键),即整个变量,而设置k“键”;将${JDSU-12-1($k)}
不起作用。您可以在Tcl中使用几乎任何字符作为变量名-唯一的限制与:
有关,因为它是名称空间分隔符,而(
用于数组-但是$
语法限制更大;它接受的名称(不使用${…}
form)必须仅由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
,因为它在调用范围内而不是在当前范围内对变量进行别名处理。您可以轻松做到:
设置变量“测试”
在访问so${set var}时,感谢您的回答。这意味着无法使用-符号设置变量。您可以在Tcl:)Argh中使用特殊字符。WTF会这样做?三重替代?问题是使用
$JDSU-12-1(键)
替代规则的访问在十多年内没有改变。我引用了(并链接了它们)根据我的回答,upvar 0
使名为theArray
的变量成为变量名JDSU-12-1
的别名。
upvar 0 JDSU-12-1 theArray
puts "the element is $theArray(key)"