2010-05-05 3 views
6

Хорошо, так что я пытаюсь распечатать процент, полный моей командной строки, теперь я хотел бы просто «обновить» число, показанное на экране. Поэтому как-нибудь вернемся к началу линии и изменим ее.Perl: отпечатать до начала строки

Например, утилита командной строки windows relog.exe (которая может конвертировать .blg-файл в CSV-файл) делает это. Если вы запустите его, он отобразит процент завершения.

Теперь это, вероятно, написано на C++. Я не знаю, возможно ли это в perl?

ответ

13

Использование «\ г» или «\ 015» восьмеричная (ака «Возвращение каретки» ака «Carriage Return» характер происходящее от пишущей машинки дней :)

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

Только не забудьте распечатать на как минимум, столько символов, сколько самая длинная строка, уже напечатанная для перезаписывания старых символов (как вы можете видеть в примере выше, отказ от этого будет содержать старые символы).

Еще одна вещь, о которой нужно помнить, - это, как указал Майкл в сообщении, включить автозапуск, пока эти печатные издания происходят, так что выход не ждет символа новой строки в самом конце обработки.

UPDATE: Обратите внимание, что 013 восьмеричный символ рекомендуется в другой ответ на самом деле Tab по вертикали:

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

Полный список специальных символов, которые вы можете распечатать, см. Http://en.wikipedia.org/wiki/ASCII – DVK

+5

Вам также необходимо включить автозапуск ('$ | = 1'), поскольку по умолчанию вывод буферизуется до тех пор, пока видится новая линия. (Или до тех пор, пока буфер не будет заполнен, но это не произойдет для счетчика хода.) –

+0

@ Майкл - мой первоначальный ответ включал автозапуск, я удалил его, чтобы сохранить длину линии, поскольку это не было строго связано с мясом вопрос ... Добавление в примечание – DVK

0

В C и C++ трюк заключается в том, чтобы печатать символ # 13. Возможно, он может работать в Perl.

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

Downvote для непроверенного кода. – daxim

8

В зависимости от того, что вы хотели бы сделать, pv может решить вашу проблему. Он может обернуть любой скрипт, который принимает файл как ввод, и добавляет индикатор выполнения.

Например

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

pv упакован для RedHat/CentOS и Ubuntu, по крайней мере. Дополнительная информация: http://www.ivarch.com/programs/pv.shtml

В противном случае я бы использовал CPAN, например. Term::ProgressBar.

+2

+1 для Progress :: Bar, лучшее решение для работы. – Ether

+0

@rjh - У меня такое чувство, что он на Windows, поэтому ему может понадобиться порт POS для DOS/Windows – DVK

+0

+1 для модуля CPAN. Я не уверен, насколько это полезно для OP, но очень полезно узнать о нем – DVK

1

Вы также можете использовать \ B для перемещения назад на один символ:

 
local $| = 1; #flush immediately 
print "Doing it - 10%"; 
sleep(1); 
print "\b\b\b"; 
print "20%"; 
print "\n", "Done", "\n"; 
Смежные вопросы