如何在Perl中动态切换到STDOUT / STDERR?

时间:2009-11-21 22:09:13

标签: perl

我很好奇我是否可以根据某些值或内联表达式(不使用if语句)在打印到STDOUT或STDERR之间切换。

print ($someFlag ? STDOUT : STDERR) "hello world!"

显然,该语法不起作用。

4 个答案:

答案 0 :(得分:14)

我认为这会做你想做的事情:

print {$someFlag ? *STDOUT : *STDERR} "hello world!";

print的文档中可以看到类似的示例。使用typeglobs以便它可以在use strict下运行。

另一种策略是根据$someFlag的值定义您自己的打印函数,其行为会有所不同。

答案 1 :(得分:6)

您是否需要评估对print的每次通话?

如果没有,这对你有用吗?

my $redir = $someFlag ? STDOUT : STDERR;
print $redir "hello world!\n";

答案 2 :(得分:4)

一种机制是“选择”输出描述符(文件通道)。

select STDERR;
print ...goes to STDERR...;
select STDOUT;
print ...goes to STDOUT...;

我怀疑现在已弃用。

答案 3 :(得分:3)

我将这种东西包装在一个返回相应文件句柄的方法中:

 print { $obj->which_handle_do_I_want } "Some message";

您可能想看看IO::Interactive的方式。

但是,如果您正在执行此操作以进行日志记录,我建议Log::Log4perl,因为您不仅可以更改输出的位置,还可以将输出发送到多个位置,设置消息的优先级,以及很多更多。并且,您可以在不更改源的情况下更改所有内容。