windows perl pipe stdin

¿Cómo puedo leer la entrada canalizada en Perl en Windows?



pipe stdin (5)

¿Podría ser Microsoft KB # 321788 ?

Las secuencias de comandos que contienen entrada estándar (STDIN) y salida estándar (STDOUT) pueden no funcionar correctamente si inicia el programa desde un indicador de comandos y utiliza una asociación de archivos para iniciar la secuencia de comandos.

Estoy tratando de crear algo en Perl que es básicamente como el comando tee Unix. Estoy intentando leer cada línea de STDIN , ejecutar una sustitución en ella e imprimirla. (Y, finalmente, también imprímalo en un archivo). Esto funciona si estoy usando la entrada de la consola, pero si trato de canalizar la entrada al comando no hace nada. Aquí hay un ejemplo simple:

print "about to loop/n"; while(<STDIN>) { s/2010/2009/; print; } print "done!/n";

Intento canalizar el comando dir de esta manera:

C:/perltest>dir | mytee.pl about to loop done!

¿Por qué no se ve la entrada canalizada? (Estoy usando Perl 5.10.0 en WinXP, si eso es relevante).


Bueno en mi humilde opinión, perl es un pobre sustituto de sed ;)

dir | sed s/2009/2010/


Esto es realmente un error en cómo Windows maneja la redirección de IO. Estoy buscando la referencia ahora mismo, pero es ese error el que requiere que especifique

dir | perl filter.pl

en lugar de poder usar

dir | filter

Consulte el artículo de Microsoft KB . La redirección STDIN / STDOUT puede no funcionar si se inicia desde una asociación de archivos :

  1. Inicie el Editor del Registro.
  2. Localice y luego haga clic en la siguiente clave del registro: HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer
  3. En el menú Editar, haga clic en Agregar valor y luego agregue el siguiente valor de registro:
    • Nombre del valor: InheritConsoleHandles
    • Tipo de datos: REG_DWORD
    • Radix: Decimal
    • Valor de los datos: 1
  4. Salir del Editor del Registro.

C:/Temp> cat filter.pl #!/usr/bin/perl while ( <> ) { print "piped: $_"; }

C:/Temp> dir | filter piped: Volume in drive C is MAIN piped: Volume Serial Number is XXXX-XXXX piped: piped: Directory of C:/Temp> piped: piped: 2010/03/19 03:48 PM . piped: 2010/03/19 03:48 PM .. piped: 2010/03/19 03:33 PM 32 m.pm piped: 2010/03/19 03:48 PM 62 filter.pl


No hay nada de malo en tratar de aprender haciendo, pero una búsqueda rápida de CPAN muestra una serie de posibles soluciones para el tee en el problema de Perl.

Por ejemplo: PerlIO::Tee .


Tratar:

C:/perltest>dir | perl mytee.pl