2010-05-05 6 views
6

Bon, alors j'essaie d'imprimer un pourcentage complet sur ma ligne de commande, maintenant je voudrais simplement mettre à jour le numéro affiché à l'écran. Donc, en quelque sorte revenir au début de la ligne et le changer. Par exemple, l'utilitaire de ligne de commande Windows relog.exe (qui peut convertir un fichier .blg en un fichier .csv) le fait. Si vous l'exécutez, il affichera un pourcentage complet.Perl: retour au début de la ligne

Maintenant cela est probablement écrit en C++. Je ne sais pas si c'est aussi possible en Perl?

Répondre

13

Utilisez "\ r" ou "\ 015" octal (alias "Retour caret" alias "Carriage Return" caractère provenant de jours machine à écrire :)

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

Il suffit de ne pas oublier d'imprimer à moins de caractères que la plus longue chaîne déjà imprimée pour écraser tous les anciens caractères (comme vous pouvez le voir dans l'exemple ci-dessus, l'échec à le faire gardera les anciens caractères). Une autre chose à savoir est, comme Michael l'a souligné dans le commentaire, l'autoflush doit être activé pendant que ces impressions se produisent, de sorte que la sortie n'attend pas de caractère de fin de ligne à la fin du traitement.

MISE À JOUR: S'il vous plaît noter que 013 octal recommandé dans une autre réponse est en fait une verticale Tab:

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

Pour une liste complète des caractères spéciaux que vous pouvez imprimer, voir http://en.wikipedia.org/wiki/ASCII – DVK

+5

Vous devez également activer l'autoflushing ('$ | = 1') car la sortie par défaut est mise en mémoire tampon jusqu'à ce qu'un newline est vu. (Ou jusqu'à ce que le tampon soit plein, mais cela ne se produira pas pour une barre de progression.) –

+0

@Michael - Ma réponse originale incluait un autoflush, je l'ai enlevé pour garder les longueurs de ligne car ce n'était pas strictement lié à la viande de la question ... Ajouter comme une note – DVK

0

En C et C++, l'astuce consiste à imprimer le caractère # 13. Peut-être que ça peut marcher en Perl.

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

downvote pour le code non testé. – daxim

8

Selon ce que vous souhaitez faire, pv pourrait résoudre votre problème. Il peut envelopper n'importe quel script qui prend un fichier en entrée, et ajouter une barre de progression.

Par exemple

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

pv est conditionné pour RedHat/CentOS et Ubuntu au moins. Pour plus d'informations: http://www.ivarch.com/programs/pv.shtml

Sinon, j'utiliserais CPAN, par ex. Term::ProgressBar.

+2

+1 pour Progress :: Bar, la meilleure solution pour le travail. – Ether

+0

@rjh - J'ai le sentiment qu'il est sur Windows, donc il peut avoir besoin d'un port DOS/Windows – DVK

+0

+1 pour le module CPAN - Je ne sais pas à quel point c'est utile pour OP mais c'est très instructif à connaître – DVK

1

Vous pouvez également utiliser \ b pour retourner un caractère:

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