perl buffering

perl - ¿Por qué no imprime nada en cada iteración de un ciclo cuando uso sleep?



buffering (3)

No está borrando el buffer. Si hay una nueva línea al final de la declaración impresa, lo hará por usted automáticamente:

use warnings; for (1 .. 20) { print "./n"; sleep 1; }

Si no desea la nueva línea (no creo que lo haga) puede usar la variable especial autoflush $| . Intente configurarlo en 1 o incrementándolo.

use warnings; $|++; for (1 .. 20) { print "."; sleep 1; }

Hoy en mi universidad, un maestro me hizo una pregunta. Escribió este código en el papel y dijo "¿Cuál será el resultado de este código?"

use warnings; for (1 .. 20) { print "."; }

Lo encontré fácil y dije que se repetirá 20 veces y que en cada iteración se imprimirá un punto (.) Y, por lo tanto, el resultado será un total de 20 puntos.

Él dijo que tienes razón y luego hizo algunos cambios en el código. El código era:

use warnings; for (1 .. 20) { print "."; sleep 1; }

Él dijo: ¿cuál será el resultado ahora? No sabía acerca de la función de dormir, supongo que en cada iteración imprimirá el punto (.) Y luego esperará durante 1 segundo (debido a la función de reposo) y luego repetirá y luego lo repetirá. imprima (.) luego esperará por 1 segundo y así sucesivamente ...

El maestro me dijo que lo revisara en casa. Lo probé en casa y supe que el segundo código espera 20 segundos y luego imprime todos los puntos (20 puntos) a la vez. Quiero saber cómo sucedió esto? ¿Por qué no se imprime el punto (.) En cada iteración?


Perl, y muchos otros programas, salida de buffer de línea por defecto. Puede establecer $| a 1 si necesita salida sin búfer.


El verdadero problema no tiene nada que ver con el sleep , sino más bien que ............

Usted está sufriendo de amortiguación . El enlace proporcionado lo lleva a un excelente artículo de The Perl Journal circa 1998 de Marc Jason Dominus (el autor de Higher-Order Perl). El artículo puede tener más de una década, pero el tema es tan relevante hoy como lo fue cuando lo escribió.

Otros han explicado los $| = 1; $| = 1; técnica. Agregaría a esos comentarios que en el pensamiento predominante de la comunidad de Perl parece ser que $| = 1 $| = 1 es preferible sobre $|++ simplemente porque es más claro en su significado. Lo sé, autoincrement también es bastante simple, pero todos los que alguna vez mirarán tu código saben $| Comportamiento cuando ++ o -- se aplican (sin buscarlo en Perlvar ). También prefiero localizar cualquier modificación de las "variables especiales" de Perl para que los efectos no se trasladen a otras partes del código que pueden no ser agradables con un cambio particular en el comportamiento predeterminado de Perl. Para que ese sea el caso, lo escribiría como:

use strict; use warnings; { local $| = 1; for ( 1 .. 20 ) { print ''.''; sleep 1; } }