2009-11-21 44 views

回答

14

我认为这会做你想要什么:

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

一个类似的例子可以print的文件中可以看出。使用typeglobs,这样它将在use strict下运行。

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

6

您是否需要评估每次致电print

如果不是,将这项工作对您:

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

我会接受它。我只有一个电话打印,但2行做到这一点很好。只是认为这将是很好的内联... – 2009-11-21 22:19:20

4

的机制是“选择”输出描述符(文件频道)。

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

虽然我怀疑这现在已被弃用。

+0

不,不推荐使用;为什么会这样? – ysth 2009-11-22 08:02:16

+0

@ysth你为什么会弃用它?因为它的全局副作用使得“print $ string == print STDOUT $ string”的方便速记不可靠。并且它使用两个完全不同的含义来重载select()函数。 – Schwern 2009-11-23 01:23:28

3

我换这样的事情在返回相应的文件句柄的方法:

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

你可能想看看如何IO::Interactive

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