2010-05-05 11 views
6

Bien, entonces lo que estoy tratando de hacer es imprimir un porcentaje completo a mi línea de comandos, ahora, me gustaría simplemente 'actualizar' el número que se muestra en la pantalla. Entonces, de alguna manera, vuelve al principio de la línea y cámbialo.Perl: imprima de nuevo al comienzo de la línea

Por ejemplo, la utilidad de línea de comandos de Windows relog.exe (que puede convertir un archivo .blg en un archivo .csv) lo hace. Si lo ejecuta, mostrará un porcentaje completo.

Ahora esto está escrito probablemente en C++. ¿No sé si esto también es posible en Perl?

Respuesta

13

Uso "\ r" o "\ 015" octal (también conocido como "Return símbolo de intercalación" también conocido como "Carriage Return" carácter procedente de la máquina de escribir :) días

> perl5.8 -e 'print "11111\r222\r3\n";' 
32211 
> perl5.8 -e 'print "11111\015222\0153\n";' 
32211 

Pero no se olvide de imprimir a al menos tantos caracteres como la cadena más larga ya impresa para sobrescribir los caracteres antiguos (como puede ver en el ejemplo anterior, el hecho de no mantenerlos guardará los caracteres antiguos).

Otra cosa a tener en cuenta es que, como señaló Michael en el comentario, el autoflush debe activarse mientras se realizan estas impresiones, de modo que la salida no espere caracteres de nueva línea al final del proceso.

ACTUALIZACIÓN: Tenga en cuenta que 013 caracteres octal recomendada en otra respuesta es en realidad una pestaña vertical:

> perl5.8 -e 'print "11111\013222\0133\n";'  
11111 
    222 
     3 
+0

Para obtener una lista completa de los caracteres especiales que puede imprimir, consulte http://en.wikipedia.org/wiki/ASCII – DVK

+5

También debe activar el autoflushing ('$ | = 1') ya que la salida predeterminada se almacena en el búfer hasta que se ve nueva línea. (O hasta que el búfer esté lleno, pero eso no sucederá con un medidor de progreso.) –

+0

@Michael - mi respuesta original incluía autoflushing, la eliminé para mantener las longitudes de línea ya que no estaba relacionada estrictamente con la carne de la pregunta ... Agregando como nota – DVK

0

En C y C++, el truco es imprimir el carácter # 13. Tal vez pueda funcionar en Perl.

for (int pc = 0 ; pc <= 100 ; ++pc) 
    printf("Percentage: %02d %% %c", pc, 13); 
printf("\n"); 
+0

Downvote para el código no probado. – daxim

8

Dependiendo de lo que desea hacer, pv podría resolver su problema. Puede envolver cualquier script que tome un archivo como entrada, y agregar una barra de progreso.

Por ejemplo

pv data.gz | gunzip -c | ./complicated-perl-script-that-reads-stdin 

pv se empaqueta para RedHat/CentOS y Ubuntu por lo menos. Más información: http://www.ivarch.com/programs/pv.shtml

De lo contrario, utilizaría CPAN, p. Term::ProgressBar.

+2

+1 para Progress :: Bar, la mejor solución para el trabajo. – Ether

+0

@rjh - Tengo la sensación de que está en Windows, por lo que puede necesitar un puerto pv DOS/Windows – DVK

+0

+1 para el módulo CPAN - No estoy seguro de cuán útil es para OP, pero es muy educativo saber sobre – DVK

1

También puede usar \ b para retroceder un carácter:

 
local $| = 1; #flush immediately 
print "Doing it - 10%"; 
sleep(1); 
print "\b\b\b"; 
print "20%"; 
print "\n", "Done", "\n"; 
Cuestiones relacionadas