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)
    ,它将尝试为该变量的值查找变量名(如果
    $name($key)
    的值为'value',
    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)
    ,它将尝试为该变量的值查找变量名(如果
    $name($key)
    的值为'value',
    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格式的东西,但在这个过程中引入了错误。