Jas*_*rne 7 variables arguments tcl dynamic exec
我已经和TCL合作了一段时间了,我花了很长时间尝试做以下事情(看起来很简单,我认为它应该是,但我无法做到正确):
我需要通过tcl脚本执行外部程序.为此,我使用exec命令.为了使用这个外部程序,我需要输入可变数量的文件.如果我直接从cmd窗口调用此程序,它将类似于:
C:\>myprogram -i file1 -i file2 -i file3 (etc., etc.)
Run Code Online (Sandbox Code Playgroud)
但是,当试图通过tcl以动态/可变的方式实现它时,我遇到了麻烦.我这样做的方法是在一些变量myvar中存储-i filex我需要的所有" "(在循环中完成),然后将其作为参数传递给exec命令.它看起来像:
exec myprogram $myvar
Run Code Online (Sandbox Code Playgroud)
这样做显然会产生一些问题,因为这个myprogram无法"看到"myvar.我猜测存在某种隐藏的终结符或不同类型的参数的冲突,这使得exec命令最终只"看到"myprogram.
所以,我的问题是,有没有人知道如何在调用中插入变量参数exec?
专门针对您的情况:
exec myprogram {*}$myvar
Run Code Online (Sandbox Code Playgroud)
eval [list exec myprogram] [lrange $myvar 0 end]
# Or...
eval [linsert $myvar 0 exec myprogram]
Run Code Online (Sandbox Code Playgroud)
没错,旧版本是丑陋的(或非显而易见的,或两者兼而有之).因此,人们倾向于写这个:
eval exec myprogram $myvar
Run Code Online (Sandbox Code Playgroud)
但这比预期慢(好吧,在运行外部程序时不那么相关!)并且$myvar由于eval工作方式而不是规范格式列表时有危险.它曾用于捕获即使是经验丰富的Tcl程序员,这也是我们在8.5中引入新语法的原因,该语法被指定为没有惊喜且非常短.