programas herencia archivos perl pipe cross-platform stdin perl-select

archivos - herencia en perl



¿Cómo puedo verificar(echar un vistazo) a STDIN para datos canalizados en Perl sin usar seleccionar? (2)

Estoy tratando de manejar la posibilidad de que no se pasen argumentos ni datos interconectados a una secuencia de comandos de Perl. Supongo que si no hay argumentos, la entrada se canaliza a través de STDIN. Sin embargo, si el usuario no proporciona argumentos y no canaliza nada a la secuencia de comandos, intentará ingresar el teclado. Mi objetivo es proporcionar un mensaje de error en su lugar.

Desafortunadamente, select() no es portátil para algunos sistemas que no son POSIX. ¿Hay alguna otra manera de hacer esto con la máxima portabilidad?


Perl viene con el operador de prueba de archivo -t , que le indica si un identificador de archivo en particular está abierto para un TTY. Entonces, deberías poder hacer esto:

if ( -t STDIN and not @ARGV ) { # We''re talking to a terminal, but have no command line arguments. # Complain loudly. } else { # We''re either reading from a file or pipe, or we have arguments in # @ARGV to process. }

Una prueba rápida revela que funciona bien en Windows con Perl 5.10.0 y Linux con Perl 5.8.8, por lo que debe ser portátil en los entornos Perl más comunes.

Como han mencionado otros, select no sería una opción confiable ya que puede haber momentos en los que esté leyendo un proceso, pero ese proceso aún no ha comenzado a escribirse.

Todo lo mejor,

Pablo


use POSIX ''isatty''; if ( ! @ARGV && isatty(*STDIN) ) { die "usage: ..."; }

Ver: http://www.opengroup.org/onlinepubs/009695399/functions/isatty.html

Tenga en cuenta que seleccionar de todos modos no sería de mucha ayuda, ya que produciría resultados falsos si la información canalizada aún no estaba lista. Ejemplo:

seq 100000|grep 99999|perl -we''$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)''