在交互式使用TCL时搜索列表时出错

问题描述 投票:0回答:2

我正在运行带有Cisco OS 7.0.5(N1)1的Cisco Nexus 5548Up。这附带了一个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命令,因为我想确保问题与我的变量初始化语法无关,而是更具实质性。

list search tcl interactive
2个回答
1
投票

您将变量的名称赋予lsearch,而不是该变量中包含的列表值。您需要通过在$前面添加前缀来取消引用该名称:

puts "Found item 122 at index [lsearch $VLAN_MATCH_LIST 122]"

Tcl关注变量名称及其内容之间的差异。一些Tcl命令采用变量的名称(脚本中的setlappend都是这样的);这通常是因为他们正在更新变量。值本身在逻辑上是只读的(实现比这更聪明,但这不是你现在应该考虑的事情)。


1
投票

列表变量的引用应该是$符号。试试你用[lsearch $VLAN_MATCH_LIST 122]代替。此外,默认列表匹配规则是-glob。在您的情况下不会导致错误,但如果您期望它使用-exact匹配规则是一个好习惯。

© www.soinside.com 2019 - 2024. All rights reserved.