TCL,接收参数作为参数,并将其传递给另一个过程
我尝试在TCL中执行以下操作,但得到了以下错误 “列表必须是偶数个元素”,因为$args在传递给B时被视为一个列表 有没有一种聪明的方法将$args传递给BTCL,接收参数作为参数,并将其传递给另一个过程,tcl,tk,Tcl,Tk,我尝试在TCL中执行以下操作,但得到了以下错误 “列表必须是偶数个元素”,因为$args在传递给B时被视为一个列表 有没有一种聪明的方法将$args传递给B proc A {a args} { #call B and pass it args B 2 $args } proc B {b args} { set options(-flag1) 0 set options(-option) serial array set options
proc A {a args} {
#call B and pass it args
B 2 $args
}
proc B {b args} {
set options(-flag1) 0
set options(-option) serial
array set options $args
#use options
}
试试这个:
B 2 {*}$args
如果我们稍微简化一下程序:
proc A args {
puts [info level 0]
B $args
}
proc B args {
puts [info level 0]
}
如果我们使用一些值调用A
,B
将接收打包在列表中的那些值。此列表是args
中的单个项目,不适合传递到数组集,因为该命令需要大小均匀的列表
% A a b c d
A a b c d
B {a b c d}
将B
的调用更改为:
proc A args {
puts [info level 0]
B {*}$args
}
现在,如果我们调用A
,A
的每个参数都将成为B
的一个独立参数,$args
现在可以用作数组集
的参数
% A a b c d
A a b c d
B a b c d
正如nurdglaw指出的,Tcl 8.4或更早版本没有{*}
语法,这意味着必须使用eval
来调用B
。一种方法是
eval [linsert $args 0 B]
但也可以使用稍不安全的(这可能会导致失去论点结构)
Tcl 8.4不再受支持,完全有理由升级到8.5或8.6
文档:,,尝试以下操作:
B 2 {*}$args
如果我们稍微简化一下程序:
proc A args {
puts [info level 0]
B $args
}
proc B args {
puts [info level 0]
}
如果我们使用一些值调用A
,B
将接收打包在列表中的那些值。此列表是args
中的单个项目,不适合传递到数组集,因为该命令需要大小均匀的列表
% A a b c d
A a b c d
B {a b c d}
将B
的调用更改为:
proc A args {
puts [info level 0]
B {*}$args
}
现在,如果我们调用A
,A
的每个参数都将成为B
的一个独立参数,$args
现在可以用作数组集
的参数
% A a b c d
A a b c d
B a b c d
正如nurdglaw指出的,Tcl 8.4或更早版本没有{*}
语法,这意味着必须使用eval
来调用B
。一种方法是
eval [linsert $args 0 B]
但也可以使用稍不安全的(这可能会导致失去论点结构)
Tcl 8.4不再受支持,完全有理由升级到8.5或8.6
文档:,,,您是否正在使用数组集
命令?分享完整的代码。@Dinesh我已经更新了代码。你在使用array set
命令吗?分享完整的代码。在那里你去@Dinesh我已经更新了代码只是为了点最后一个我。。。Tcl 8.5中引入了{*}
操作符。如果您确实必须使用早期版本,则需要通过更加不透明的eval[linsert$args 0 B]
-调用B,该函数创建一个包含B和所有单个参数的新列表,然后将该列表作为命令进行求值。鉴于args
保证是一个正确的列表,您可以使用eval[名单B]$args
。它比linsert
版本更容易理解。但肯定是升级了,因为8.4不再受支持。该死!!彼得和@nurdglaw,我真是太感谢你了。挽救了我的一天。关于这个版本,我正在使用8.3。我刚开始为一家大公司工作,我不拥有代码。我认为他们不会这么做ant将很快升级。但我会问。只是为了点画最后一个I…Tcl 8.5中引入了{*}
操作符。如果您确实必须使用早期版本,则需要通过更不透明的eval[linsert$args 0 B]调用B
-它创建一个包含B和所有单个参数的新列表,然后将该列表作为命令进行计算。假定它是args
,保证是一个正确的列表,您可以使用eval[list B]$args
。它比linsert
版本更容易理解。但肯定是升级了,因为8.4不再受支持。该死!!彼得和@nurdglaw,我真是太感谢你了。挽救了我的一天。关于这个版本,我正在使用8.3。我刚开始为一家大公司工作,我不拥有代码。我认为他们不会这么做蚂蚁很快就会升级,但我会问的。