2010-05-05 10 views
6

Ok, quindi quello che sto cercando di fare è stampare una percentuale completa alla mia riga di comando, ora, mi piacerebbe semplicemente "aggiornare" il numero mostrato sullo schermo. Quindi in qualche modo tornare all'inizio della linea e cambiarlo.Perl: stampa di nuovo all'inizio della riga

Ad esempio l'utilità della riga di comando windows relog.exe (che può convertire un file .blg in un file .csv) fa ciò. Se lo esegui, verrà visualizzata una percentuale completa.

Ora questo è probabilmente scritto in C++. Non so se questo è possibile anche in perl?

risposta

13

Usa "\ r" o "\ 015" ottale (alias "accento circonflesso Return" alias "Carriage Return" personaggio proveniente da giorni macchina da scrivere :)

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

Basta non dimenticare di stampare a almeno tanti caratteri come la stringa più lunga già stampata per sovrascrivere i vecchi caratteri (come puoi vedere nell'esempio sopra, l'impossibilità di farlo manterrà i vecchi caratteri).

Un'altra cosa a cui prestare attenzione è che, come indicato da Michael nel commment, è necessario attivare l'autoflush mentre queste stampe avvengono, in modo che l'output non aspetti il ​​carattere di nuova riga alla fine dell'elaborazione.

UPDATE: prega di notare che 013 carattere ottale raccomandato in un'altra risposta è in realtà un Tab verticale:

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

Per un elenco completo di caratteri speciali che è possibile stampare, vedere http://en.wikipedia.org/wiki/ASCII – DVK

+5

È inoltre necessario attivare il metodo di autoflushing ('$ | = 1') poiché per impostazione predefinita l'output viene memorizzato nel buffer fino a un newline è visto. (O fino a quando il buffer non è pieno, ma ciò non accadrà per un indicatore di avanzamento.) –

+0

@Michael - la mia risposta originale includeva l'autoflushing, l'ho rimosso per mantenere la lunghezza della linea ridotta in quanto non era strettamente correlata alla carne di la domanda ... Aggiungendo come nota – DVK

0

In C e C++, il trucco è stampare il carattere # 13. Forse può funzionare in Perl.

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

downvote per il codice non testato. – daxim

8

A seconda di quello che ci piace fare, pv potrebbe risolvere il problema. Può avvolgere qualsiasi script che accetta un file come input e aggiungere una barra di avanzamento.

Ad esempio

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

pv è confezionato per RedHat/CentOS e Ubuntu almeno. Ulteriori informazioni: http://www.ivarch.com/programs/pv.shtml

Altrimenti userei CPAN, ad es. Term::ProgressBar.

+2

+1 per Progress :: Bar, la soluzione migliore per il lavoro. – Ether

+0

@rjh - Ho la sensazione che sia su Windows, quindi potrebbe aver bisogno di una porta Pv DOS/Windows – DVK

+0

+1 per il modulo CPAN - Non sono sicuro di quanto sia utile per OP ma è molto istruttivo sapere – DVK

1

È possibile anche usare \ b per spostare indietro di un carattere:

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