2009-11-21 10 views

Antwort

14

Ich denke, das tun, was Sie wollen:

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

Ein ähnliches Beispiel in der Dokumentation werden kann für print gesehen. Verwenden Sie typeglobs, damit es unter use strict ausgeführt wird.

Eine weitere Strategie besteht darin, eine eigene Druckfunktion zu definieren, die sich je nach Wert von $someFlag anders verhält.

6

Müssen Sie für jeden Anruf zu print auswerten?

Wenn nicht, würde diese Arbeit für Sie:

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

Ich nehme es. Ich habe nur einen Anruf zu drucken, aber 2 Zeilen, um es zu tun, sind in Ordnung. Ich dachte nur, es wäre schön inline ... –

4

Ein Mechanismus ist die Ausgabe Descriptor (Dateikanal) zu 'wählen'.

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

Ich vermute, dass dies jetzt veraltet ist, obwohl.

+0

nein, nicht veraltet; Warum sollte es sein? – ysth

+0

@ysth Warum würdest du es ablehnen? Wegen seines globalen Nebeneffekts, der die bequeme Abkürzung von "print $ string == print STDOUT $ string" unzuverlässig macht. Und es überlädt die Funktion select() mit zwei völlig verschiedenen Bedeutungen. – Schwern

3

Ich wickle diese Art der Sache in einem Verfahren, das die entsprechende Dateikennung zurückgibt:

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

Sie könnten, wie IO::Interactive aussehen wollen.

Wenn Sie dies jedoch für die Protokollierung tun, empfehle ich Log::Log4perl, da Sie nicht nur ändern können, wo die Ausgabe geht, aber die Ausgabe an mehrere Orte senden können, Prioritäten für die Nachricht festlegen und vieles mehr. Und Sie können alles ändern, ohne die Quelle zu ändern.

Verwandte Themen