我很好奇我是否可以根据某些值或内联表达式(不使用if语句)在打印到STDOUT或STDERR之间切换。
print ($someFlag ? STDOUT : STDERR) "hello world!"
显然,该语法不起作用。
答案 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,因为您不仅可以更改输出的位置,还可以将输出发送到多个位置,设置消息的优先级,以及很多更多。并且,您可以在不更改源的情况下更改所有内容。