Tcl 如何将参数传递给 proc

Tcl How to pass arguments to a proc

我是 TCL 的新手,很难调用第三部分过程,如果我们传递如下值,它会完美地工作:

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

我收到错误 -

"illegal binding ...$id $data $val"

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

让我们来看看不同之处。使用单个大括号集,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"]]