从tcl执行perl脚本

从tcl执行perl脚本,tcl,Tcl,我正在尝试从Tcl执行一个Perl脚本 我在Tcl中使用eval,它执行Perl脚本,但不执行Tcl文件中的其他命令 Tcl: 结果:执行Perl脚本,但不执行put命令。这是为什么?在tcl中,eval将其参数作为tcl代码执行,类似于它的perl等价物。但是,您不希望这样,而是需要将perl解释器作为外部进程启动,并要求该解释器执行在其命令行中传递的脚本。这是tcl中的exec的工作 exec perl perl_script 阅读更多关于exec@ 更新 当命令返回非零退出状态时,exe

我正在尝试从Tcl执行一个Perl脚本

我在Tcl中使用
eval
,它执行Perl脚本,但不执行Tcl文件中的其他命令

Tcl:


结果:执行Perl脚本,但不执行
put
命令。这是为什么?

在tcl中,
eval
将其参数作为tcl代码执行,类似于它的perl等价物。但是,您不希望这样,而是需要将perl解释器作为外部进程启动,并要求该解释器执行在其命令行中传递的脚本。这是tcl中的
exec
的工作

exec perl perl_script
阅读更多关于exec@

更新

当命令返回非零退出状态时,
exec
将抛出错误。您需要将
exec
包装为
catch
以继续非零退出状态。看

更新2


eval perl script\u path
成功启动perl解释器的原因是tcl的
unknown
magic。很可能您没有名为perl的tcl proc。因此,tcl调用“unknown”proc,它试图通过对其参数调用
exec
智能地处理此异常,因为它在
$env(PATH)
中找到一个可执行文件。您可以尝试
info body unknown
来查看这个魔术是如何实际工作的。

在tcl中,
eval
以tcl代码的形式执行它的参数,类似于它的perl等价物。但是,您不希望这样,而是需要将perl解释器作为外部进程启动,并要求该解释器执行在其命令行中传递的脚本。这是tcl中的
exec
的工作

exec perl perl_script
阅读更多关于exec@

更新

当命令返回非零退出状态时,
exec
将抛出错误。您需要将
exec
包装为
catch
以继续非零退出状态。看

更新2

eval perl script\u path
成功启动perl解释器的原因是tcl的
unknown
magic。很可能您没有名为perl的tcl proc。因此,tcl调用“unknown”proc,它试图通过对其参数调用
exec
智能地处理此异常,因为它在
$env(PATH)
中找到一个可执行文件。您可以尝试
info body unknown
,看看这个魔术到底是如何工作的。

试试这个:

exec sh -c { perl -ape 's/this/that/' tmp.1 > tmp.11 }
它适合我。

试试这个:

exec sh -c { perl -ape 's/this/that/' tmp.1 > tmp.11 }

它对我很有用。

我对
tcl
一无所知,但是说
eval
执行作为参数传递给它的tcl,而不是启动外部程序(很像Perl的
eval EXPR
执行Perl代码,其中
EXPR
结果)。我觉得你关于这执行Perl脚本的说法值得怀疑,我认为如果你真的使用了正确的函数来启动一个程序,你的问题就会得到解决。在Tcl中,使用exec来运行外部程序更合适,但即使使用exec,我也有同样的行为。我对
Tcl
,一无所知,但是说
eval
执行作为参数传递给它的tcl,而不是启动外部程序(很像Perl的
eval EXPR
执行Perl代码,其中
EXPR
的结果)。我觉得你关于这执行Perl脚本的说法值得怀疑,我认为如果你真的使用了正确的函数来启动程序,你的问题就会得到解决。在Tcl中,使用exec来运行外部程序更合适,但即使使用exec,我也得到了同样的行为。谢谢你,Gowtham,我实际上遵循了你的第一次更新,我用exec来抓,效果很好。
unknown
魔法很长,很神奇,很可能会吓到马。不用太担心。谢谢你,高谭,我实际上是在关注你的第一次更新,我使用了exec和一个catch,它很有效。
unknown
魔法很长,很神奇,很可能会吓到马。不要太担心。