2011-11-17 130 views
3

我想本地方式来解决这个问题...Perl - 控制台输出?

我有一个perl命令,打一个电话,有时,直接打印出来的文本到控制台。

我想是这样的:

$text = get_output_from(MagicCommandICan'tChange()); 
if ($text neq "a specific value") { 
    print $text; 
} 

没有办法做到这一点?

+1

考虑改写的问题。从你的问题描述中,我认为你并不是真的想要抑制控制台输出,而是想要捕获它。 – MetaEd

+0

你真的应该说MagicCommandICan'tChange()是什么样的命令。 Perl的?系统? – TLP

回答

7

IO::CaptureOutput

use IO::CaptureOutput qw(capture qxx qxy); 

# STDOUT and STDERR separately 
capture { noisy_sub(@args) } \$stdout, \$stderr; 
+3

['Capture :: Tiny'](http://p3rl.org/Capture:Tiny) – daxim

+0

完美。哦,贝尔,你是如此强大和邪恶。 – Jeremy

2

我假设这个Perl脚本正在调用外部可执行文件。如果输出打印在stdout上,则可以使用反引号操作符或qx来运行该命令并捕获输出。在Unix系统上,您可以使用system(),并使用>运算符将输出重定向到/dev/null。您也可以拨打open使用以下命令:

如果文件名开头“|”,文件名被解释为 命令,其输出是用管道,如果文件名 结尾的“| ',文件名被解释为 管道输出给我们的命令。有关这方面的更多示例,请参阅perlipc中的“使用open()for IPC”的 。 (您不允许“打开” 命令,该命令可以输入和输出,但可以在perlipc中查看IPC :: Open2, IPC :: Open3以及“与另一个 过程的双向通信”)

最后,您可以关闭并重新打开STDOUT和STDERR文件句柄(编辑IO::CaptureOutput以下推荐)。虽然这有点奇怪,我不会推荐它作为最好的选择。