2009-11-21 48 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,因爲您不僅可以更改輸出的位置,還可以將輸出發送到多個位置,爲消息設置優先級等等。而且,您可以在不更改來源的情況下更改所有這些內容。