我在TCL声明一个数组说
set JDSU-12-1(key) element
parray JDSU-12-1
我收到错误,说JDSU不是数组
即使是简单的put语句也无效
% puts $JDSU-12-1(key)
can't read "JDSU": no such variable
有什么方法可以用连字符声明数组名称。我知道_在数组中工作但不确定连字符
答案 0 :(得分:4)
你可以在Tcl变量名中使用特殊字符。你需要那些大括号:
% puts ${JDSU-12-1(key)}
element
您甚至可以使用$
:
% set \$word "Hello world" ;# Or set {$word} "Hello world"
% puts ${$word}
Hello world
编辑:一些参考:
beedub.com(强调我的)
set命令用于为变量赋值。它有两个参数:第一个是变量的名称,第二个是值。 变量名称可以是任意长度,大小写很重要。实际上,您可以使用变量名中的任何字符。
答案 1 :(得分:3)
虽然您可以使用此类特殊字符,但在尝试使用$varname
访问变量时,只能使用一些字符。
引用manual:
中的相关部分
$
名称名称是标量变量的名称;名称是一个或多个字符的序列,这些字符是字母,数字,下划线或命名空间分隔符(两个或多个冒号)。字母和数字只是标准的ASCII字母(
0-9
,A-Z
和a-z
)。
$
名称(
索引)
Name 给出数组变量的名称,index给出该数组中元素的名称。名称必须仅包含字母,数字,下划线和命名空间分隔符,并且可以是空字符串。字母和数字只是标准的ASCII字母(
0-9
,A-Z
和a-z
)。对索引的字符执行命令替换,变量替换和反斜杠替换。
${
名称}
Name是标量变量或数组元素的名称。除了括号之外,它可能包含任何字符。如果name的格式为“ arrayName ( index )”,则表示数组元素,其中arrayName不包含任何左括号字符“
(
”,或者括号括号,“}
”和索引可以是除紧密括号字符外的任何字符序列。在解析名称时不会执行进一步的替换。单个单词中可能有任意数量的变量替换。对括号中的单词不执行变量替换。
请注意,变量可能包含上面列出的字符序列以外的字符序列,但在这种情况下,必须使用其他机制来访问它们(例如,通过set命令的单参数形式)。
我想稍微强调最后一段:
您始终可以使用set varname
:
set JDSU-12-1(key) element
puts [set JDSU-12-1(key)]
与${varname}
访问权限不同,您可以替换变量名称的一部分(在您的情况下是数组键),整个变量,而set k "key"; puts ${JDSU-12-1($k)}
不起作用。
答案 2 :(得分:3)
你可以在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
是如何做的,尽管它使用{{1}},因为它是调用范围中的变量的别名而不是当前范围。
答案 3 :(得分:0)
与大多数其他编程语言一样,TCL变量必须是字母(A
到Z
或_
)的字母数字。连字符或短划线(-
)不允许作为变量名称的一部分,否则会与算术减号或减法混淆:$x-1
作为变量名称"x-1"
之间没有区别或$x-1
为变量x
减去1
。
答案 4 :(得分:0)
试试这个:)
subst $\{[subst ${conn}](phan)\}
答案 5 :(得分:0)
你在哪个版本工作? 我的tcl工作。
% set JDSU-12-1(key) element
element
% parray JDSU-12-1
JDSU-12-1(key) = element
答案 6 :(得分:0)
您可以轻松地做到这一点:
set set-var“测试” 同时访问$ {set-var}