Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们能在TCL中用连字符给出数组名吗_Tcl - Fatal编程技术网

我们能在TCL中用连字符给出数组名吗

我们能在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,或)。不允许连字符或破折号(-)作为变量

我在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
,或
)。不允许连字符或破折号(
-
)作为变量名的一部分,否则它将与算术减号或减法相混淆:将
$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)"