将动态参数传递给 foreach 命令

Passing Dynamic Arguments to foreach command

我想将参数 (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 部分作为动态参数传递。我该怎么做?

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

set foreachArg "name $names"

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

所以这样会更好:

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

如果你仍然想使用大括号,它有点复杂,因为可能需要使用 subst 来首先 'convert' 变量 $foreachArg 的文字 $foreachArg =] 但您可能仍需要将列表在列表中更深一层:

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