2009-11-21 10 views

Respuesta

14

creo que esto va a hacer lo que quiere:

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

Un ejemplo similar se puede ver en la documentación de print. Use typeglobs para que se ejecute bajo use strict.

Otra estrategia es definir su propia función de impresión que se comportará de manera diferente, según el valor de $someFlag.

6

¿Necesita evaluar cada llamada al print?

Si no es así, lo haría este trabajo para usted:

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

Lo tomaré. Solo tengo una llamada para imprimir, pero 2 líneas para hacerlo están bien. Sólo pensé que sería bueno en línea ... –

4

Un mecanismo es a 'seleccionar' el descriptor de salida (canal de archivos).

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

Sospecho que esto ya no se utiliza, sin embargo.

+0

no, no desaprobado; ¿Por qué sería? – ysth

+0

@ysth ¿Por qué lo desaprobarías? Debido a su efecto secundario global que hace que la práctica forma abreviada de "print $ string == print STDOUT $ string" no sea confiable. Y sobrecarga la función select() con dos significados totalmente diferentes. – Schwern

3

envuelvo este tipo de cosas en un método que devuelve el gestor de archivo apropiado:

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

Es posible que desee ver cómo IO::Interactive.

Sin embargo, si lo hace para iniciar sesión, le recomiendo Log::Log4perl ya que no solo puede cambiar dónde va la salida, sino que puede enviar la salida a varios lugares, establecer prioridades para el mensaje y mucho más. Y puede cambiar todo eso sin cambiar la fuente.

Cuestiones relacionadas