Perl: печать до начала строки - PullRequest
8 голосов
/ 05 мая 2010

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

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

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

Ответы [ 4 ]

15 голосов
/ 05 мая 2010

Используйте восьмеричные символы "\ r" или "\ 015" (также известный как символ возврата возврата "aka" Символ возврата каретки", взятый из дней пишущей машинки:)

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

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

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

ОБНОВЛЕНИЕ: Обратите внимание, что восьмеричный символ 013, рекомендуемый в другом ответе, фактически является вертикальной вкладкой:

> perl5.8 -e 'print "11111\013222\0133\n";'    
11111
     222
        3
8 голосов
/ 05 мая 2010

В зависимости от того, что вы хотите сделать, 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 .

1 голос
/ 05 мая 2010

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

local $| = 1; #flush immediately
print "Doing it - 10%";
sleep(1);
print "\b\b\b";
print "20%";
print "\n", "Done", "\n";
0 голосов
/ 05 мая 2010

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

for (int pc = 0 ; pc <= 100 ; ++pc)
    printf("Percentage: %02d %%  %c", pc, 13);
printf("\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...