modules metacpan perl perl-module

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 y STDERR están predefinidos. (Los identificadores de archivos stdin , stdout y stderr 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.