perl - modules - metacpan
¿Cuál es la diferencia entre<stdin> y<STDIN>? (2)
Cuando uso <stdin>
en los archivos del módulo Perl ( *.pm
) no está leyendo la entrada del teclado, pero cuando uso <STDIN>
en el mismo lugar, funciona bien.
¿Por qué no se recibe información cuando uso <stdin>
?
No sabía esto, pero lo encontré documentado en un párrafo perlop
en perlop
Los
STDERR
STDIN
,STDOUT
ySTDERR
están predefinidos. (Los identificadores de archivosstdin
,stdout
ystderr
también funcionarán excepto en los paquetes, donde se interpretarán como identificadores locales en lugar de globales). Se pueden crear manejadores de archivos adicionales con la función open (), entre otros. Consulte perlopentut y "abrir" en perlfunc para obtener detalles sobre esto.
STDIN
es el identificador de archivo documentado. También existe la stdin
, que tiene un alias para STDIN
, pero solo funciona en main::
package: main::stdin
es igual que main::STDIN
(tal como se documenta en perlop - Operadores de Perl y prioridad ).
En un paquete, por lo tanto,
package My::Package;
sub xx {
print while <stdin>;
}
stdin
se interpreta como My::Package::stdin
, que no existe. Puede usar main::stdin
desde un paquete, pero usar el STDIN
estándar (que siempre apunta a main::STDIN
, incluso desde un paquete) es mucho más limpio.