2010-05-05 28 views
6

Được rồi, vì vậy những gì tôi đang cố gắng thực hiện là in ra phần trăm hoàn thành cho dòng lệnh của tôi, bây giờ, tôi muốn điều này đơn giản là 'cập nhật' số hiển thị trên màn hình. Vì vậy, bằng cách nào đó quay trở lại đầu dòng và thay đổi nó.Perl: in trở lại đầu dòng

Ví dụ: tiện ích dòng lệnh windows relog.exe (có thể chuyển đổi tệp .blg thành tệp .csv) thực hiện việc này. Nếu bạn chạy nó, nó sẽ hiển thị một tỷ lệ phần trăm hoàn thành.

Bây giờ, điều này có thể được viết bằng C++. Tôi không biết điều này có khả thi trong perl không?

Trả lời

13

Sử dụng "\ r" hoặc "\ 015" bát phân (hay còn gọi là "Return caret" aka "Carriage Return" nhân vật có nguồn gốc từ những ngày máy đánh chữ :)

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

Chỉ cần đừng quên để in tại ít nhất là nhiều ký tự như chuỗi dài nhất đã được in để ghi đè lên bất kỳ ký tự cũ nào (như bạn có thể thấy trong ví dụ ở trên, việc không làm như vậy sẽ giữ các ký tự cũ).

Một điều cần lưu ý là, như Michael đã chỉ ra trong cam kết, tự động quét cần được bật trong khi các bản in này xảy ra, sao cho đầu ra không chờ ký tự dòng mới ở cuối quá trình xử lý.

UPDATE: Xin lưu ý rằng 013 nhân vật bát phân khuyến cáo trong câu trả lời khác thực sự là một Tab dọc:

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

Để có danh sách đầy đủ các ký tự đặc biệt bạn có thể in, hãy xem http://en.wikipedia.org/wiki/ASCII – DVK

+5

Bạn cũng cần bật tự động điền ('$ | = 1') như theo mặc định đầu ra được đệm cho đến khi newline được nhìn thấy. (Hoặc cho đến khi bộ đệm đầy, nhưng điều đó sẽ không xảy ra cho đồng hồ đo tiến độ.) –

+0

@Michael - câu trả lời ban đầu của tôi bao gồm tự động điền, tôi đã xóa nó để giữ độ dài dòng vì nó không nói đúng liên quan đến thịt câu hỏi ... Thêm vào một ghi chú – DVK

0

Trong C và C++, mẹo là để in char # 13. Có lẽ nó có thể làm việc trong Perl.

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

downvote cho mã chưa được kiểm tra. – daxim

8

Tùy thuộc vào những gì bạn muốn làm, pv có thể giải quyết vấn đề của bạn. Nó có thể bọc bất kỳ tập lệnh nào lấy tệp làm đầu vào và thêm thanh tiến trình.

Ví dụ

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

pv được đóng gói cho RedHat/CentOS và Ubuntu ít nhất. Thông tin thêm: http://www.ivarch.com/programs/pv.shtml

Nếu không, tôi sẽ sử dụng CPAN, ví dụ: Term::ProgressBar.

+2

+1 cho tiến trình :: Bar, giải pháp tốt nhất cho công việc. – Ether

+0

@ rjh - Tôi có cảm giác anh ấy đang sử dụng Windows, vì vậy anh ấy có thể cần một cổng pv DOS/Windows – DVK

+0

+1 cho mô-đun CPAN - Tôi không chắc chắn về cách sử dụng OP nhưng nó rất hữu ích để biết về – DVK

1

Bạn cũng có thể sử dụng \ b để di chuyển trở lại một ký tự:

 
local $| = 1; #flush immediately 
print "Doing it - 10%"; 
sleep(1); 
print "\b\b\b"; 
print "20%"; 
print "\n", "Done", "\n"; 
Các vấn đề liên quan