将动态参数传递给foreach命令

时间:2015-01-27 07:06:00

标签: function arguments tcl

我想将参数(var list)动态传递给foreach命令。 我试过这个:

% set names {Alice Bob Charlie}
Alice Bob Charlie
% foreach name $names {puts $name}
Alice
Bob
Charlie
% set foreachArg {name $names}
name $names
% foreach $foreachArg {puts $name}
wrong # args: should be "foreach varList list ?varList list ...? command"
% foreach {*}$foreachArg {puts $name}
$names
% foreach {*}[set foreachArg] {puts $name}
$names
% foreach {*}[list [set foreachArg]] {puts $name}
wrong # args: should be "foreach varList list ?varList list ...? command"

这里我想将name $names部分作为动态参数传递。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我认为问题的根源在于您使用文字字符串$names而不是$names变量中的变量$foreachArg来执行此操作。如果你这样做可能会更容易:

set foreachArg "name $names"

但这会导致$foreachArg包含普通列表name Alice Bob Charlie

所以这会更好:

set foreachArg "name [list $names]"
foreach {*}$foreachArg {puts $name}

如果您仍然想要使用大括号,那么它可能需要使用subst来首先转换'变量$foreachArg的文字$foreachArg,但您仍然需要将列表更深层放在列表中:

set foreachArg {name [list $names]}
foreach {*}[subst $foreachArg] {puts $name}