/ / <operador en UNIX, pasando al script Perl - perl, línea de comandos, stdin

<operador en UNIX, pasando a Perl script - perl, línea de comandos, stdin

Al evaluar if(-t STDIN), ¿el operador <UNIX cuenta como STDIN? Si no, ¿cómo obtengo esos datos?

Entonces alguien escribe perl example.pl < testing.txt. Esto no se comporta como datos canalizados a través de ls | ./example.pl. ¿Cómo puedo obtener ese comportamiento?

Respuestas

5 para la respuesta № 1

Prueba -p STDIN, que comprueba si el identificador de archivo STDIN Está unido a una tubería.

touch foo
perl -e "print -p STDIN" < foo            # nothing
cat foo | perl -e "print -p STDIN"        # 1

Pero no estoy seguro de entender su pregunta. En los tres casos

1.  perl -e "print $_=<STDIN>" < <(echo foo)
2.  echo foo | perl -e "print $_=<STDIN>"
3.  perl -e "print $_=<STDIN>"          # then type "foon" to the console

las entradas son iguales y todas accesibles a través de STDIN filehandle En los primeros dos casos, -t STDIN evaluará a falso, y en el segundo caso, -p STDIN será verdad

Las diferencias de comportamiento entre estos treslos casos son sutiles, y generalmente no son importantes. El tercer caso, obviamente, esperará hasta que se reciba al menos una línea de entrada (terminada con "n" o EOF). La diferencia entre los dos primeros casos es aún más sutil. Cuando la entrada a su programa se canaliza desde la salida de otro proceso, está a merced de ese primer proceso con respecto a la latencia o si ese programa amortigua su salida.

Tal vez podrías ampliar lo que quieres decir cuando dices

perl example.pl < testing.txt

no se comporta como

ls | ./example.pl

2 para la respuesta № 2

-t prueba si o no STDIN se adjunta a un tty.

Cuando canaliza datos a Perl, no se adjuntará a un tty. Esto no debe depender del mecanismo que use para canalizar (es decir, si canaliza un comando usando | o canalizar un archivo usando <.) Sin embargo, tendrá un tty adjunto cuando ejecute el programa directamente. Dado el siguiente ejemplo:

#!/usr/bin/perl
print ((-t STDIN) ? "is a ttyn" : "is not a ttyn");

Usted esperaría el siguiente resultado:

% perl ./ttytest.pl
is a tty
% perl ./ttytest.pl < somefile
is not a tty
% ls | perl ./ttytest.pl
is not a tty