用动态变量在TCL中编写一个程序

用动态变量在TCL中编写一个程序,tcl,Tcl,我是TCL的新手,正在尝试编写一个接受动态值的TCL过程。 我想把n个接口和vlan对传递给进程 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 $vla

我是TCL的新手,正在尝试编写一个接受动态值的TCL过程。 我想把n个接口和vlan对传递给进程

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

{device[interface vlan]这取决于您希望如何映射参数,但关键命令可能是
foreach
lassign

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 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}}
您还可以一次迭代两个列表(是的,如果您愿意,这将与多变量形式混合使用):

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

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 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}}
我不太清楚如何才能让它们达到你想要的效果,但它肯定是一个或另一个,可能是混合的。

谢谢@Donal Fellows

发布我正在寻找的代码:

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 ...}

您发布的答案不是很有效。您使用的逻辑将逐个检查所有接口,并检查每个接口的所有VLAN


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

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