2010-05-05 11 views
6

OK, więc próbuję zrobić wydruk procentowy do mojego wiersza poleceń, teraz chciałbym po prostu "zaktualizować" numer wyświetlony na ekranie. Więc jakoś wróć do początku linii i zmień ją.Perl: drukuj z powrotem na początek linii

Na przykład narzędzie wiersza polecenia window relog.exe (które może przekonwertować plik .blg na plik .csv) wykonuje to. Jeśli go uruchomisz, wyświetli procent ukończenia.

Teraz jest to prawdopodobnie napisane w C++. Nie wiem, czy jest to możliwe również w perlu?

Odpowiedz

13

Use "\ r" lub "\ 015" ósemkowej (aka "powrót karetki" aka charakter "Carriage Return" pochodzący z dni do pisania :)

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

Tylko nie zapomnij, aby wydrukować na najmniej tyle znaków, co najdłuższy ciąg już wydrukowany w celu zastąpienia starych znaków (jak widać w powyższym przykładzie, niepowodzenie to będzie zachowywać stare znaki).

Inną rzeczą, o której należy pamiętać, jest to, że - jak wskazał Michael w komendzie - należy włączyć automatyczną pompę podczas wykonywania tych wydruków, aby wyjście nie czekało na znak nowej linii na samym końcu przetwarzania.

UPDATE: Należy pamiętać, że 013 ósemkowy charakter zalecany w innym odpowiedź jest rzeczywiście Tab pionie:

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

Aby uzyskać pełną listę znaków specjalnych, które można wydrukować, zobacz http://pl.wikipedia.org/wiki/ASCII – DVK

+5

Należy również włączyć automatyczne wypełnianie ('$ | = 1'), ponieważ domyślnie dane wyjściowe są buforowane do momentu Widać znak nowej linii. (Lub dopóki bufor się nie zapełni, ale tak się nie stanie w przypadku miernika postępu). –

+0

@Michael - moja oryginalna odpowiedź obejmowała autouruchamianie, usunąłem ją, aby utrzymać długość linii w dół, ponieważ nie było to ściśle związane z mięsem pytanie ... Dodanie jako uwagi: – DVK

0

W języku C i C++, zadaniem jest wydrukowanie char # 13. Może to działa w Perlu.

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

Downvote dla kodu przetestowane. – daxim

8

W zależności od tego, co chcesz zrobić, pv może rozwiązać Twój problem. Może zawijać dowolny skrypt, który pobiera plik jako dane wejściowe i dodać pasek postępu.

Przykładowo

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

pv jest zapakowany do RedHat'a/CentOS Ubuntu przynajmniej. Więcej informacji: http://www.ivarch.com/programs/pv.shtml

W przeciwnym razie użyłbym CPAN, np. Term::ProgressBar.

+2

+1 dla Progress :: Bar, najlepsze rozwiązanie do pracy. – Ether

+0

@rjh - Mam wrażenie, że jest on w systemie Windows, więc może potrzebować portu DOS/Windows pv – DVK

+0

+1 dla modułu CPAN - nie jestem pewien, jak użyteczne jest OP, ale jest to bardzo pouczające wiedzieć o – DVK

1

Można również użyć \ b, aby cofnąć się o jeden znak:

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