【问题标题】:Error Searching a List when Using TCL Interactively交互式使用 TCL 时搜索列表时出错
【发布时间】:2019-04-18 19:51:04
【问题描述】:

我正在运行带有 Cisco 操作系统版本 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


    【解决方案1】:

    您将变量的名称提供给lsearch,而不是该变量中包含的列表值。您需要通过在名称前加上 $ 来取消对名称的引用:

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

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

    【讨论】:

    • 明白了。感谢培训!
    【解决方案2】:

    对列表变量的引用应带有$ 符号。尝试使用 [lsearch $VLAN_MATCH_LIST 122] 代替。此外,默认列表匹配规则为-glob。这不会在您的情况下导致错误,但如果您期望,最好使用-exact 匹配规则。

    【讨论】:

    • 啊!谢谢;这完全修复了它。
    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 2019-09-06
    • 2019-06-08
    • 1970-01-01
    • 2016-03-24
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多