【问题标题】:Write a procedures in TCL with dynamic variable用动态变量在 TCL 中编写程序
【发布时间】:2017-03-08 18:28:04
【问题描述】:

我是 TCL 新手,正在尝试编写一个 TCL 程序,它采用动态值。 就像我想将 n 个接口和 vlan 对传递给 proc。

proc proc_data {device, intf_in, intf_out, args} {
foreach vlan $args {
    set inter_vlan [$device exec "show interface $intf_in $vlan"]
    set inter_vlan [$device exec "show interface $intf_out $vlan"]
    ....
         }
}

有什么办法可以通过:

{ device [interface vlan] <<<<< dynamic no of pair

【问题讨论】:

  • 只传递一个值列表?另外,不要在 Tcl 中使用逗号来分隔变量。

标签: tcl


【解决方案1】:

这取决于您希望如何映射参数,但关键命令可能是foreachlassign

foreach 命令每次通过循环可以消耗多个值。这是一个简单的例子:

proc foreachmultidemo {args} {
    foreach {a b} $args {
        puts "a=$a, b=$b, a+b=[expr {$a+$b}]"
    }
}
foreachmultidemo 1 2 3 4 5 6

您也可以一次迭代两个列表(是的,如果您愿意,这可以与多变量形式混合使用):

proc foreachdoubledemo {list1 list2} {
    foreach a $list1 b $list2 {
        puts "a=$a, b=$b, a+b=[expr {$a+$b}]"
    }
}
foreachdoubledemo {1 2 3} {4 5 6}

lassign 命令可以获取一个列表并将其拆分为变量。这是一个简单的例子:

proc lassigndemo {mylist} {
    foreach pair $mylist {
        lassign $pair a b
        puts "a=$a, b=$b, a+b=[expr {$a+$b}]"
    }
}
lassigndemo {{1 2} {3 4} {5 6}}

我不太确定如何让这些实现你所追求的,但它肯定是其中之一,可能是混合的。

【讨论】:

    【解决方案2】:

    感谢@Donal 研究员

    发布我正在寻找的代码:

    proc data_proc {device intr vlan} {
    puts "Logged in device is: $device"
    foreach a $intr {
        set interface [$device "show interface $a"
        foreach b $vlan {
        set inter_vlan [$device "show interface $a vlan $b"
        }
      }
    }
    data_proc device {interface1 interface2 ...} {vlan1 vlan2 ...}
    

    【讨论】:

      【解决方案3】:

      您发布的答案效率不高。你使用的逻辑会一一检查所有接口,检查每个接口的所有vlan。

      如果您需要检查一个特定的 vlan 集而不是几个接口的所有 vlan,该怎么办?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多