Por el bien del lector (desde OP ya "tengo trabajo"):
La documentación de Perl, "perlopentut" (perldoc perlopentut) proporciona ejemplos de cómo abrir un identificador de archivo alternativo dirigido a STDOUT, pero utiliza manejadores de archivos sin bordes y la versión de dos arg de open
, ambos algo antiguos. El libro "Perl Best Practices" de Damian Conway (así como Perl :: Critic, que está basado en el libro de Damian) enfatiza el uso de tres arg opens y manejadores de archivos léxicos (my $foo
style filehandles). El "Perl Moderno" de chromatic también menciona brevemente el uso de manejadores de archivos léxicos, y desalienta las palabras no tratadas cuando es práctico. Los tres arg open
se consideran una forma más segura, ya que limitan la exposición a las inyecciones de proyectiles. Si bien el caso específico aquí es de bajo riesgo, sigue siendo un buen hábito el incumplimiento de las tres arg open
.
Se necesita una cuidadosa lectura de los ejemplos que se muestran en la documentación de Perl open
(perldoc -f abierto), y un poco de interpretación para notar la colocación correcta del carácter y comercial en la apertura de una filahandle duplicado dirigida a STDOUT
cuando se utilizan los tres-arg versión de open
. Uno podría suponer erróneamente que esto debería funcionar: open my $fh, '>', '&STDOUT' or die $!;
, sobre todo porque se ve como un formato que estamos acostumbrados a ver (símbolo y precediendo al nombre de un símbolo). Pero esa sintaxis no es lo que open
necesita, y estamos acostumbrados a verlo en un contexto completamente diferente: ciertas llamadas de subrutinas.
La forma correcta de abrir una víctima a STDOUT
con los tres arg open
es combinar la >
y la &
en el mismo segundo argumento, y dejar STDOUT al descubierto, como este:
use Modern::Perl;
open my $fh, '>&', STDOUT or die "Bleah: $!";
say $fh 'Printing alternate filehandle "$fh" worked.';
say 'Implicitly printing to "STDOUT" also works.';
O pasar STDOUT
a open
como una referencia a la typeglob:
open my $fh, '>&', \*STDOUT or ...
'...} else {open ($ fh, '> &'. Fileno (STDOUT)); } ' – mob