使用动态变量在TCL中编写过程

时间:2017-02-27 11:15:46

标签: tcl

我是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

3 个答案:

答案 0 :(得分: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}}

我不太确定如何让这些做你所追求的,但它必然是一个或另一个,可能是混合。

答案 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,该怎么办?