交互式使用 TCL 时搜索列表时出错
Error Searching a List when Using TCL Interactively
我是 运行 Cisco Nexus 5548Up,带有 Cisco OS 版本 7.0.5(N1)1。它带有一个 TCL 解释器,版本 8.5.7,我正在交互式使用它,但得到的结果我不明白,也不知道如何更正。
set VLAN_MATCH_LIST {}
lappend VLAN_MATCH_LIST 102
lappend VLAN_MATCH_LIST 122
lappend VLAN_MATCH_LIST 232
lappend VLAN_MATCH_LIST 242
lappend VLAN_MATCH_LIST 243
lappend VLAN_MATCH_LIST 246
lappend VLAN_MATCH_LIST 259
lappend VLAN_MATCH_LIST 283
lappend VLAN_MATCH_LIST 286
lappend VLAN_MATCH_LIST 288
lappend VLAN_MATCH_LIST 334
lappend VLAN_MATCH_LIST 341
lappend VLAN_MATCH_LIST 346
lappend VLAN_MATCH_LIST 356
lappend VLAN_MATCH_LIST 358
lappend VLAN_MATCH_LIST 373
puts "List: $VLAN_MATCH_LIST"
puts "Found item 122 at index [lsearch VLAN_MATCH_LIST 122]"
不幸的是,我希望在索引 1 处找到“122”,但我一直收到此输出(仅最后 2 行):
List: 102 122 232 242 243 246 259 283 286 288 334 341 346 356 358 373
Found item 122 at index -1
如果你想知道,我做了所有的 lappend 事情而不是使用 set
命令,因为我想确保这个问题与我的变量初始化语法无关,而是更多实质性的。
对列表变量的引用应带有$
符号。尝试使用 [lsearch $VLAN_MATCH_LIST 122]
代替。另外,默认的列表匹配规则是-glob
。在您的情况下不会导致错误,但如果您希望使用 -exact
匹配规则,这是一种很好的做法。
您将变量的名称提供给 lsearch
,而不是该变量中包含的列表值。您需要通过在名称前加上 $
:
来取消引用该名称
puts "Found item 122 at index [lsearch $VLAN_MATCH_LIST 122]"
Tcl 非常关心变量名称和变量内容之间的区别。一些Tcl命令采用变量名(你脚本中的set
和lappend
都是这样);这通常是因为他们正在更新变量。值本身在逻辑上是只读的(实现比这更聪明,但你现在不应该考虑这个问题)。
我是 运行 Cisco Nexus 5548Up,带有 Cisco OS 版本 7.0.5(N1)1。它带有一个 TCL 解释器,版本 8.5.7,我正在交互式使用它,但得到的结果我不明白,也不知道如何更正。
set VLAN_MATCH_LIST {}
lappend VLAN_MATCH_LIST 102
lappend VLAN_MATCH_LIST 122
lappend VLAN_MATCH_LIST 232
lappend VLAN_MATCH_LIST 242
lappend VLAN_MATCH_LIST 243
lappend VLAN_MATCH_LIST 246
lappend VLAN_MATCH_LIST 259
lappend VLAN_MATCH_LIST 283
lappend VLAN_MATCH_LIST 286
lappend VLAN_MATCH_LIST 288
lappend VLAN_MATCH_LIST 334
lappend VLAN_MATCH_LIST 341
lappend VLAN_MATCH_LIST 346
lappend VLAN_MATCH_LIST 356
lappend VLAN_MATCH_LIST 358
lappend VLAN_MATCH_LIST 373
puts "List: $VLAN_MATCH_LIST"
puts "Found item 122 at index [lsearch VLAN_MATCH_LIST 122]"
不幸的是,我希望在索引 1 处找到“122”,但我一直收到此输出(仅最后 2 行):
List: 102 122 232 242 243 246 259 283 286 288 334 341 346 356 358 373
Found item 122 at index -1
如果你想知道,我做了所有的 lappend 事情而不是使用 set
命令,因为我想确保这个问题与我的变量初始化语法无关,而是更多实质性的。
对列表变量的引用应带有$
符号。尝试使用 [lsearch $VLAN_MATCH_LIST 122]
代替。另外,默认的列表匹配规则是-glob
。在您的情况下不会导致错误,但如果您希望使用 -exact
匹配规则,这是一种很好的做法。
您将变量的名称提供给 lsearch
,而不是该变量中包含的列表值。您需要通过在名称前加上 $
:
puts "Found item 122 at index [lsearch $VLAN_MATCH_LIST 122]"
Tcl 非常关心变量名称和变量内容之间的区别。一些Tcl命令采用变量名(你脚本中的set
和lappend
都是这样);这通常是因为他们正在更新变量。值本身在逻辑上是只读的(实现比这更聪明,但你现在不应该考虑这个问题)。