Perl 将来自STDOUT和STDERR的消息分配给TCL变量

Perl 将来自STDOUT和STDERR的消息分配给TCL变量,perl,tcl,stdout,stderr,Perl,Tcl,Stdout,Stderr,我希望在Windows中以TCL脚本执行的命令的输出中得到一些组织。情况是,我有一个tcl脚本,它最终调用一个perl脚本。大概是这样的: perl脚本将结果输出到stdout和stderr: #print message to STDOUT by default print "process A running ..."; ... if ($fail) { #print to STDERR print STDERR "Process A failed."; } 起初,我

我希望在Windows中以TCL脚本执行的命令的输出中得到一些组织。情况是,我有一个tcl脚本,它最终调用一个perl脚本。大概是这样的:

perl脚本将结果输出到stdout和stderr:

#print message to STDOUT by default
print "process A running ...";
...
if ($fail) {
    #print to STDERR
    print STDERR "Process A failed.";
}   
起初,我只想从tcl脚本中看到从prints到STDERR的消息,但现在我想看到这两个消息。是否有方法将从打印到标准输出的消息保存到一个tcl变量,并将从打印到标准输出的消息保存到另一个tcl变量?这是我在tcl的一次尝试,目的是实现这一点:

puts "Running perl script ..."
catch {[set stdout_var [exec perl C:/myScript.pl >@stdout]]} err_msg
puts "\n\nerrmsg:\n$err_msg"
puts "\n\nstdout:\n$stdout_var"
这样做,我只会在err_msg变量中获得打印到STDERR的消息(所以我已经完成了一半),但是,stdout_var变量从未设置为任何值。我希望它会被设置为发送给STDOUT的消息,但事实并非如此。如果我删除>@stdout,stdout\u var仍然不会被分配,err\u msg包含打印到STDERR和stdout的所有消息

谢谢你的意见

有一个例子


比我希望的复杂一点,但我试了一下$标准_错误只包含错误消息,这很好。但是,$stnadard_输出包含stnadard输出和标准错误消息。我想我可以再处理一些来移除它们,但我希望它们一开始就不会出现在那里。我本以为这会奏效。除非告诉perl脚本将错误吐到两个通道;大家都知道我会把这些东西放进去调试,然后很久以后才知道是什么导致了它们(事实上这是我自己的代码!)也许你也这么做了?将其中一个重定向到一个临时文件。
 puts "Running perl script ..."

 set pipe [open "| perl C:/myScript.pl"]
 set standard_output [read -nonewline $pipe]
 set exit_status 0
 if {[catch {close $pipe} standard_error] != 0} {
     global errorCode
     if {"CHILDSTATUS" == [lindex $errorCode 0]} {
         set exit_status [lindex $errorCode 2]
     }
 }
 puts "exit status: $exit_status"
 puts "\n\nstdout:\n$standard_output"
 puts "\n\nstderr:\n$standard_error"