TCL:如果数组名也是一个变量,我如何检查数组的信息
我无法检查数组是否存在,数组名称在变量中。在我的例子中,数组名也包含空格TCL:如果数组名也是一个变量,我如何检查数组的信息,tcl,Tcl,我无法检查数组是否存在,数组名称在变量中。在我的例子中,数组名也包含空格 code snippet: array set a\ b{ key1 "val1" } proc checkArr {name} { if {![info exists $name($key)]} { return {} } } checkArr "a b" 错误:无法读取“名称(键1)”:变量不是数组 有人能帮忙吗?代码的主要问题是,您试图查看数组是否存
code snippet:
array set a\ b{
key1 "val1"
}
proc checkArr {name}
{
if {![info exists $name($key)]} {
return {}
}
}
checkArr "a b"
错误:无法读取“名称(键1)”:变量不是数组
有人能帮忙吗?代码的主要问题是,您试图查看数组是否存在于本地作用域中,而它是否存在于全局作用域中
array set a\ b {
key1 "val1"
}
proc checkArr {name} {
upvar $name arr
if {![info exists arr(key1)]} {
return 0
} else {
return 1
}
}
为了在proc的本地范围内访问数组,可以使用global$name
或upvar$name arr
(我使用了上面的后者),或者在执行info exist
部分时可以使用uplevel
我对代码进行了一些其他调整:
- 在
部分中添加了空格,否则只向函数提供一个参数数组集
- 将
更改为$name($key)
arr(key 1)
使用变量名,因此如果使用info exists
,它将尝试为该变量的值查找变量名(如果$name($key)
的值为'value',$name($key)
将尝试查找名为info exists
的变量是否存在,但数组值value
不存在,因此您会得到错误信息)$name($key)
array set a\ b {
key1 "val1"
}
proc checkArr {name} {
upvar $name arr
if {![info exists arr(key1)]} {
return 0
} else {
return 1
}
}
为了在proc的本地范围内访问数组,可以使用global$name
或upvar$name arr
(我使用了上面的后者),或者在执行info exist
部分时可以使用uplevel
我对代码进行了一些其他调整:
- 在
部分中添加了空格,否则只向函数提供一个参数数组集
- 将
更改为$name($key)
arr(key 1)
使用变量名,因此如果使用info exists
,它将尝试为该变量的值查找变量名(如果$name($key)
的值为'value',$name($key)
将尝试查找名为info exists
的变量是否存在,但数组值value
不存在,因此您会得到错误信息)$name($key)
proc checkArr name {
uplevel #0 [list info exists $name]
}
% checkArr "a b"
0
此命令在作为参数指定时执行脚本info exists{ab}
,但不在命令内部的本地级别上执行:uplevel#0
部分表示脚本在全局级别上执行
现在我们创建数组,并检查它:
% array set a\ b {key1 val1}
% checkArr "a b"
1
它存在。我们还可以使用相同的代码检查数组成员的存在性:
% checkArr "a b(key1)"
1
事实上,任何类型的字符串都可以传递给checkArr
,它会告诉您是否有具有该名称的变量(数组或其他)。如果要为数组成员使用专门的检查器,可以这样编写:
proc checkArrayMember {arrName memberName} {
uplevel #0 [list info exists $arrName\($memberName)]
}
% checkArrayMember "a b" key1
1
左括号前面的反斜杠去掉了它的语法含义,使它成为字符串的一部分:脚本实际上变成了info exists{ab(key1)}
文件:
,
,
,
,
,
让我们创建一个命令来检查是否存在全局数组:
proc checkArr name {
uplevel #0 [list info exists $name]
}
% checkArr "a b"
0
此命令在作为参数指定时执行脚本info exists{ab}
,但不在命令内部的本地级别上执行:uplevel#0
部分表示脚本在全局级别上执行
现在我们创建数组,并检查它:
% array set a\ b {key1 val1}
% checkArr "a b"
1
它存在。我们还可以使用相同的代码检查数组成员的存在性:
% checkArr "a b(key1)"
1
事实上,任何类型的字符串都可以传递给checkArr
,它会告诉您是否有具有该名称的变量(数组或其他)。如果要为数组成员使用专门的检查器,可以这样编写:
proc checkArrayMember {arrName memberName} {
uplevel #0 [list info exists $arrName\($memberName)]
}
% checkArrayMember "a b" key1
1
左括号前面的反斜杠去掉了它的语法含义,使它成为字符串的一部分:脚本实际上变成了info exists{ab(key1)}
文件:
,
,
,
,
,
您提供的样本除了说明的问题外,还有许多问题。请提供可复制的代码片段。谢谢@Jerry的帮助。如果数组名是一个变量,并且有空格,我只需要信息存在方面的帮助。请帮助复制:等。你提供的样品除了你所说的问题之外还有很多问题。请提供可复制的代码片段。谢谢@Jerry的帮助。如果数组名是一个变量,并且有空格,我只需要信息存在方面的帮助。请帮助复制:等。如果。。。返回。。。否则返回…可能更容易理解:
返回[info exists arr(key1)]
是的,如果。。。否则…format在可能的情况下,OP稍后将使用该结构返回不同的内容。从外观上看,他们删除了原始代码的很大一部分,他们必须展示一些适合Q格式的东西,但在这个过程中引入了错误。。。返回。。。否则返回…可能更容易理解:返回[info exists arr(key1)]
是的,如果。。。否则…format在可能的情况下,OP稍后将使用该结构返回不同的内容。从外观上看,他们删除了原始代码的很大一部分,他们必须展示一些适合Q格式的东西,但在这个过程中引入了错误。