2

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

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

4

7 回答 7

4

可以在 Tcl 变量名中使用特殊字符。不过,您需要这些大括号:

% puts ${JDSU-12-1(key)}
element

你甚至可以使用$

% set \$word "Hello world" ;# Or set {$word} "Hello world"
% puts ${$word}
Hello world

编辑:一些参考:

beedub.com(重点是我的)

set 命令用于为变量赋值。它有两个参数:第一个是变量的名称,第二个是值。变量名可以是任意长度,并且大小写很重要。事实上,您可以在变量名中使用任何字符。

于 2013-09-19T04:53:47.927 回答
3

虽然可以使用这样的特殊字符,但在尝试使用$varname.

引用手册中的相关部分:

$姓名

Name是标量变量的名称;名称是一个或多个字符的序列,它们是字母、数字、下划线或命名空间分隔符(两个或多个冒号)。字母和数字只是标准的 ASCII 字符(0-9A-Za-z

$名称(索引)

Name给出了数组变量的名称, index 给出了该数组中元素的名称。名称只能包含字母、数字、下划线和命名空间分隔符,并且可以是空字符串。字母和数字只是标准的 ASCII 字符(0-9A-Za-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)}不起作用。

于 2013-09-19T06:47:56.307 回答
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它是因为它是调用范围内的变量而不是当前范围内的变量的别名。

于 2013-09-19T08:57:27.017 回答
1

您可以轻松地做到这一点:

访问时设置 set-var "test" ${set-var}

于 2019-07-12T01:33:38.727 回答
0

与大多数其他编程语言一样,TCL 变量必须是以字母(AtoZ_)开头的字母数字。连字符或破折号 ( -) 不允许作为变量名的一部分,否则它会与算术减法或减法混淆:$x-1作为带有名称的变量"x-1"$x-1作为变量x减法之间没有区别1

于 2013-09-19T04:31:09.667 回答
0

尝试这个 :)

subst $\{[subst ${conn}](phan)\}
于 2013-09-19T04:47:13.967 回答
0

你用的是哪个版本??我的 tcl 工作。

% set JDSU-12-1(key) element 

element

% parray JDSU-12-1

JDSU-12-1(key) = element
于 2013-09-19T06:25:15.787 回答