【问题标题】:Tcl How to pass arguments to a procTcl如何将参数传递给proc
【发布时间】:2020-08-04 04:18:15
【问题描述】:

我是 TCL 的新手,如果我们传递如下值,我很难调用第三部分 proc,它可以完美运行:

set result [3RD_par_api {{ifAdminStatus.2 Integer 1}}]
puts $result

ifAdminStatus.2 是 OID [SNMP 对象标识符],Integer 是数据类型,要设置的值为 1。

代码运行良好,但是当我尝试使用脚本变量时:

set result [3RD_par_api {{$id $data $val}}]
puts $result

我收到错误 -

"非法绑定...$id $data $val"

如何将用户定义/变量作为参数传递给 3RD_par_api 方法,双括号中的参数是什么意思“{{ }}”?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    让我们来看看它们的区别。使用一组大括号,Tcl 处理 参数作为一个单词(在某些方面类似于其他语言中的单引号)。 但是,如果您以列表的形式访问它,它会被分解成多个部分:

    foreach elem {ifAdminStatus.2 Integer 1} {
       puts $elem
    }
    
    ifAdminStatus.2
    Integer
    1
    

    还有双括号:

    foreach elem {{ifAdminStatus.2 Integer 1}} {
       puts $elem
    }
    
    ifAdminStatus.2 Integer 1
    

    列表现在包含一个参数:“ifAdminStatus.2 Integer 1”。

    要创建列表,请使用list 命令:

    # this is the same as {ifAdminStatus.2 Integer 1}
    # it contains three strings
    set arg [list ifAdminStatus.2 Integer 1]
    
    # this is the same as {{ifAdminStatus.2 Integer 1}}
    # it contains a single string
    set arg [list {ifAdminStatus.2 Integer 1}]
    

    显然 API 想要一个带有单个字符串作为参数的列表。 要使用变量创建它,请使用两次list 命令。

    set id ifAdminStatus.2
    set data Integer
    set val 1
    set arg [list [list $id $data $val]]
    foreach elem $arg {
       puts $elem
    }
    
    ifAdminStatus.2 Integer 1
    

    你想尝试的是:

    set result [3RD_par_api [list [list $id $data $val]]]
    

    或者简单地说:

    set result [3RD_par_api [list "$id $data $val"]]
    

    【讨论】:

    • 不知道为什么 API 会那样做。让生活变得困难。
    • 非常感谢使用“set result [3RD_par_api [list [list $id $data $val]]]”解决了我的问题。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2016-07-12
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多