Tcl 使用eval为脚本提供参数
我真的不明白如何使用Tcl 使用eval为脚本提供参数,tcl,eval,Tcl,Eval,我真的不明白如何使用eval参数。 如果我要评估的脚本是: set myscript { puts $::argv } 然后我想这样调用我的脚本: eval $myscript anArgument 我希望输出为“辩论”,但我有: can not find channel named "" while evaluating {eval $script vvv} 当您调用eval时,该命令将连接其所有参数并尝试计算结果列表(或字符串,如果您愿意,在这里也是一样)。因此,首先将参数{puts$
eval
参数。
如果我要评估的脚本是:
set myscript { puts $::argv }
然后我想这样调用我的脚本:
eval $myscript anArgument
我希望输出为“辩论”,但我有:
can not find channel named ""
while evaluating {eval $script vvv}
当您调用
eval
时,该命令将连接其所有参数并尝试计算结果列表(或字符串,如果您愿意,在这里也是一样)。因此,首先将参数{puts$::argv}
和anaargument
连接到列表{puts$::argv anaargument}
,然后解释器尝试对其求值。如果全局变量argv
的值为空列表,则调用的实际命令将等效于put{}anaargument
puts
将尝试使用{}
作为通道标识符输出到,失败并留下错误消息
现在,如果您想做的是将anaargument
传递给myscript
,然后将eval
作为put anaargument
,您应该改为编写
set myscript {puts $myarg}
set myarg anArgument
eval $myscript
在第一行中,$myarg
的计算被推迟,因为引号将$
转换为常规文本字符。然后将变量myarg
设置为一个值(只要它位于eval
之前,代码中的任何位置都可能发生这种情况)。在第三行中,对脚本求值,此时参数$myarg
被值anaargument
替换,然后打印
您尝试的调用类型是可能的,但是您需要使用apply
而不是eval
,以及闭包(匿名函数)而不是脚本
set myfunc {myarg {puts $myarg}}
apply $myfunc anArgument
全局变量argv
不会将参数传递给传递给eval
的脚本:当操作系统启动tclsh
或wish
时,给定的任何命令行参数都放置在argv
中,并且除非您自己更改,否则在执行过程中不会更改该值(不要那样做,这只是让人困惑)
文件:
argv
已记录在案