Página 1 de 1

Problemas con la salida estándar

NotaPublicado: 2013-04-29 05:56 @289
por Oberon
Hola a todos.

Me ha surgido un pequeño problema con una aplicación que estoy programando en Perl, utilizando Eclipse + Epic.
Estoy realizando unos cálculos y me interesa indicar, de forma muy sencilla, el progreso mientras el programa se está ejecutando. Simplemente con que vaya dibujando una línea del tipo "********" me conformo.

Así, he hecho, algo simple del tipo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub evaluaAli
  2. {
  3.         ...
  4.         for (my $i=0; $i<scalar(@species)-1; $i++)
  5.         {
  6.                 for(my $j=$i+1;$j<scalar(@species);$j++)
  7.                         {
  8.                         ...
  9.                         }      
  10.                 print "**"; #dibuja el progreso
  11.         }
  12.         print "\n Hecho \n";
  13.         return
  14. }
  15.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Cuando lo ejecuto, en el terminal de la plataforma eclipse me aparece todo de manera correcta. Quiero decir, cada vez que se ejecuta el bucle, escribe "**" por lo que la barra se va rellenando poco a poco.
Sin embargo, cuando lo ejecuto sobre el terminal de Linux, no aparece nada hasta que la subrutina finaliza, momento en que aparece la "barra" entera de golpe.
¿Alguien sabe a qué puede deberse esto?
¡Gracias por la atención!
:)

Re: Problemas con la salida estándar

NotaPublicado: 2013-04-29 06:50 @326
por explorer
Bienvenido a los foros de Perl en Español, Oberon.

Es porque la salida estándar está siendo almacenada en un búfer temporal, y cuando se cierra el archivo o se llena el búfer, sale de golpe.

Es exactamente a como funciona el proceso de lectura y escritura de archivos en disco, solo que para Unix, la salida estándar a pantalla es como si fuese otro archivo.

Lo que hay que decirle al sistema es que no use ese búfer, y que las salidas se "escriban" inmediatamente.

Al principio del programa, escribe esto:

$| = 1;

Más información en tu propio ordenador en perldoc perlvar, y en la Web (traducido al español).

Alternativamente, para hacer barras de progreso (y depuración de variables y mucho más), se suele usar el módulo Smart::Comments. La línea 4 quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         for (my $i=0; $i<scalar(@species)-1; $i++)  ### Progreso***     hecho
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y el módulo se encargaría de lo demás.

Casi mejor, ponerlo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         for my $i ( 0 .. $#species-1 )  ### Progreso***     hecho
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
ya que es más preciso.

Re: Problemas con la salida estándar

NotaPublicado: 2013-04-29 09:10 @424
por Oberon
Suponía que era algo del buffer pero no sabía como vaciarlo.
Soy bastante novato con Perl, y resolver este tipo de cuestiones me hace perder mucho tiempo.
¡Muchísimas gracias y un saludo!
;)