我们可以在TCL中使用连字符给出数组名称

时间:2013-09-19 04:23:01

标签: tcl

我在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

有什么方法可以用连字符声明数组名称。我知道_在数组中工作但不确定连字符

7 个答案:

答案 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-9A-Za-z)。

  
     

$ 名称 ( 索引 )

     
    

Name 给出数组变量的名称,index给出该数组中元素的名称。名称必须仅包含字母,数字,下划线和命名空间分隔符,并且可以是空字符串。字母和数字只是标准的ASCII字母(0-9A-Za-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变量必须是字母(AZ_)的字母数字。连字符或短划线(-)不允许作为变量名称的一部分,否则会与算术减号或减法混淆:$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}