TCL:检查变量是否为列表
TCL: check if variable is list
set var1 A
set var2 {A}
是否可以检查变量是否在 TCL 中的列表中?对于 var1
和 var2
llength
给出 1
。我认为这两个变量被认为是相同的。它们都是包含 1 个元素的列表。我说得对吗?
您可以尝试 string is list $var1
,但这将接受这两种形式 - 它只会 return 错误地处理无法在句法上解释为列表的内容,例如。因为有一个不匹配的括号,如 "aa { bb".
这两个东西被认为是完全相同的,并且会产生相同的字节码(除了用于指示常量内容所在位置的任何字节偏移量,这根本不是通常暴露给脚本的信息,因此您可以忽略它,加上由于变量名引起的明显差异)。从语义上讲,大括号是一种引用机制,而不是列表(或脚本,或……)的指示符
您需要编写代码,不要假设它可以通过检查值的类型来查找内容。 123
的类型可以是许多不同的东西,例如整数、列表(长度为 1)、unicode 字符串或命令名称。 Tcl 的语义基于您 而不是 询问值的类型,而只是使用命令并让它们根据需要将值强制转换为正确的类型。 Tcl 在这方面与许多其他语言不同。
由于采用了这种不同的方法,因此总体上回答有关此问题并不容易:答案太长,需要考虑所有不同的可能情况一般但大多数其中的一部分与您真正想做的事情无关。尽管询问一些具体的事情,我们将能够更轻松地告诉您。
set var1 A
set var2 {A}
是否可以检查变量是否在 TCL 中的列表中?对于 var1
和 var2
llength
给出 1
。我认为这两个变量被认为是相同的。它们都是包含 1 个元素的列表。我说得对吗?
您可以尝试 string is list $var1
,但这将接受这两种形式 - 它只会 return 错误地处理无法在句法上解释为列表的内容,例如。因为有一个不匹配的括号,如 "aa { bb".
这两个东西被认为是完全相同的,并且会产生相同的字节码(除了用于指示常量内容所在位置的任何字节偏移量,这根本不是通常暴露给脚本的信息,因此您可以忽略它,加上由于变量名引起的明显差异)。从语义上讲,大括号是一种引用机制,而不是列表(或脚本,或……)的指示符
您需要编写代码,不要假设它可以通过检查值的类型来查找内容。 123
的类型可以是许多不同的东西,例如整数、列表(长度为 1)、unicode 字符串或命令名称。 Tcl 的语义基于您 而不是 询问值的类型,而只是使用命令并让它们根据需要将值强制转换为正确的类型。 Tcl 在这方面与许多其他语言不同。
由于采用了这种不同的方法,因此总体上回答有关此问题并不容易:答案太长,需要考虑所有不同的可能情况一般但大多数其中的一部分与您真正想做的事情无关。尽管询问一些具体的事情,我们将能够更轻松地告诉您。