Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Usar un pipe como argumento

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Mar Ene 01, 2008 7:29 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 474
Ubicación: Frente al monitor
Usar un pipe como argumento Responder citando

Buenas.

Tengo un programa que toma como argumento un path de X archivo ( perl miprograma.pl ../archivo.dat )

Eso es fácil de hacer ( por ARGV ) pero... ¿Que tal si ejecuto el programa con un pipe?

Algo como
bash:
cat ../archivo.dat | perl miprograma.pl


¿Cómo trabajo con esto, cómo leo ese archivo?
Mensaje Mar Ene 01, 2008 8:02 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4034
Ubicación: Valladolid, España
Responder citando

Estás entubando la salida de cat a la entrada estándar de perl, así que deberás de usar <> (<STDIN>).
Mensaje Mie Ene 02, 2008 9:22 am
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 474
Ubicación: Frente al monitor
Responder citando

Claro, eso es... Mr. Green
¡Gracias!
Mensaje Mie Ene 02, 2008 10:39 am
Jenda
Perlero Nuevo
Perlero Nuevo
Registrado: 29 Oct 2007
Mensajes: 99
Ubicación: Praga, Republica Checa
Responder citando

explorer escribió:
Estás entubando la salida de cat a la entrada estándar de perl, así que deberás de usar <> (<STDIN>).


Para poner esto más claro .. con <STDIN> lees del input estándart. Que significa del pipe

cat blah.txt | ./programa.pl

o del archivo mandado al stdin del proceso

./programa.pl < blah.txt

o del humano que está delante del compu. En el primero caso cada ves que acabas de leer un archivo obtienes un undef y si sigues a leer Perl abres el archivo siguiente.

Con <> lees de los archivos incluidos cuando lanzas la programa

./programa.pl archivo1.txt archivo2.txt

o del pipe o archivo mandado al stdin o el humano.
Mensaje Mie Ene 02, 2008 11:13 am
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 474
Ubicación: Frente al monitor
Responder citando

Confused Qué hago si quero usar el STDIN así:
bash:
cat ../archivo.dat | perl miprograma.pl
miprograma.pl: El archivo.dat está corrupto, desea  eliminarlo? [Y|n] y

¿Cómo leo ese "y" o ese "n" si estoy usando el STDIN para leer el archivo?
Mensaje Mie Ene 02, 2008 2:14 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4034
Ubicación: Valladolid, España
Responder citando

Si esa pregunta sale en pantalla hacia el usuario, en mitad de la lectura del fichero que entra por la entrada estándar, no podrás distinguir lo que recibes del fichero de lo que te responda el usuario.

Pero sí si has consumido todo el fichero. Deberás usar la función clearerr(), según indica el perlfaq8, Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
Mensaje Mie Ene 02, 2008 3:58 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 474
Ubicación: Frente al monitor
Responder citando

Hmmm... está bien, pero no puedo leer todo el archivo de una sola vez.

Intenté abrir la tty y leer la entrada, pero al crear el pipe desde la terminal el programa no está corriendo desde el dispositivo ( obvio, está corriendo en el pipe ¿O no es eso? ).

Si puedo leer la tty, este problema será historia.
Mensaje Mie Ene 02, 2008 4:12 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4034
Ubicación: Valladolid, España
Responder citando

¿Y no es más fácil hacer
Perl:
perl miprograma.pl archivo.dat
?
Así sabes qué fichero tienes que procesar y te queda la entrada estándar para preguntar al usuario.
Mensaje Mie Ene 02, 2008 4:27 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 474
Ubicación: Frente al monitor
Responder citando

Sí, lo es, pero no para el que programa en shell y tiene que usar grep o cualquier otro comando.

Lo que quiero hacer es un lector de documentos... la idea es que se pueda ejecutar como less o more.
Mensaje Mie Ene 02, 2008 4:41 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4034
Ubicación: Valladolid, España
Responder citando

¡Hey! ¡Estamos en Perl! ¡Casi todo ya está hecho!
Perl:
    use Term::Pager;
   
    my $t = Term::Pager->new( rows => 25, cols => 80 );
    $t->add_text( $text );
    $t->more();

Hay más módulos en CPAN. Busca por 'pager'.
Mensaje Mie Ene 02, 2008 5:48 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 474
Ubicación: Frente al monitor
Responder citando

Je, je... el módulo no hace falta... lo logré leyendo la tty ( "/dev/tty" y no POSIX::ttyname(0); ) y funciona excelente.
Gracias por la ayuda.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group