我是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
答案 0 :(得分:1)
这取决于您希望如何映射参数,但关键命令可能是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 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}}
我不太确定如何让这些做你所追求的,但它必然是一个或另一个,可能是混合。
答案 1 :(得分:0)
感谢@Donal Fellows
发布我正在寻找的代码:
import java.util.HashMap;
class Employee{
private int id;
public Employee(int i) {
this.id = i;
}
public int getId()
{
return id;
}
@Override
public boolean equals(Object o) {
return this.id == ((Employee) o).id;
}
@Override
public int hashCode() {
Integer idInt = new Integer(id);
return idInt.hashCode();
}
}
public class HashMapExample {
static HashMap<Employee,Integer> hm = new HashMap<>();
public static void main(String args[]) {
hm.put(new Employee(100),10);
hm.put(new Employee(100), 20);
hm.put(new Employee(200), 50);
for (Employee e: hm.keySet()) {
System.out.println("Employee " + e.getId() + ", value = " + hm.get(e));
}
}
}
答案 2 :(得分:0)
您发布的答案效率不高。您使用的逻辑将逐个检查所有接口并检查每个接口的所有vlan。
如果你需要为一些接口检查特定的vlan集而不是所有的vlan,该怎么办?