2009-11-23 14 views
7

Tôi muốn xuất một thanh tiến trình, nhưng làm cách nào để lấy chiều rộng đầu cuối trong Perl?Làm thế nào để lấy chiều rộng đầu cuối trong Perl?

Một giải pháp Perl cốt lõi sẽ được ưu tiên, vì tôi không có quyền truy cập vào trình biên dịch, chỉ cần cài đặt 5.8.2 Perl.

+5

Bạn luôn có quyền truy cập vào một trình biên dịch. Không có luật nào nói rằng bạn phải biên dịch nó trên cùng một máy chủ. –

+0

[mỉa mai] Bình thường có ... nhưng không phải ở đây. Vì mọi người đều biết rằng Java & Perl chỉ có thể được phát triển trên bất kỳ hộp nào, không cần phải có cùng một môi trường (đọc kiến ​​trúc) trên nền tảng dev hơn nền sản xuất ... [/ sarcastic] –

+1

Tại sao lại mỉa mai? Tôi đang cho bạn một câu trả lời nghiêm túc. Hệ thống phát triển và sản xuất của bạn không thực sự quan trọng. Bạn có thể biên dịch chéo cho cả hai. Bạn đang ở đây để được giúp đỡ và tôi đã giúp bạn miễn phí, do đó, không shit vào nó. –

Trả lời

26

Câu hỏi thường gặp đi kèm với Perl có câu trả lời cho câu hỏi này. Nếu bạn chạy perldoc -q "screen size", bạn sẽ nhận được các thông tin sau:

Làm cách nào để có kích thước màn hình?

Nếu bạn đã cài đặt Term::ReadKey mô-đun từ CPAN, bạn có thể sử dụng nó để lấy chiều rộng và chiều cao trong nhân vật và tính theo pixel:

use Term::ReadKey; 
($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize(); 

Đây là di động nhiều hơn "ioctl" thô, nhưng không như minh họa:

require 'sys/ioctl.ph'; 
die "no TIOCGWINSZ" unless defined &TIOCGWINSZ; 
open(TTY, "+</dev/tty") or die "No tty: $!"; 
unless (ioctl(TTY, &TIOCGWINSZ, $winsize='')) { 
    die sprintf "$0: ioctl TIOCGWINSZ (%08x: $!)\n", &TIOCGWINSZ; 
} 
($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize); 
print "(row,col) = ($row,$col)"; 
print " (xpixel,ypixel) = ($xpixel,$ypixel)" if $xpixel || $ypixel; 
print "\n"; 

vì vậy, bạn có thể sử dụng một trong những cuối cùng nếu bạn muốn có một giải pháp Perl tinh khiết, hoặc cài đặt Term::ReadKey từ CPAN nếu bạn muốn có một giải pháp đơn giản trong mã của bạn nhưng thiết lập trước nhiều hơn.

+0

Làm cách nào để chạy 'h2ph' như được ngụ ý bởi thông báo lỗi:' Không thể định vị sys/ioctl.ph trong @INC (bạn đã chạy hay chưa) h2ph?) ' –

+0

@Steve: vậy điều gì xảy ra khi bạn cố gắng chạy' h2ph'? – Ether

+0

@Ether: tôi đã bỏ tùy chọn '-d' của' h2ph'. Bây giờ nó nói 'ioctl.pl: ioctl TIOCGWINSZ (40007468: Một cuộc gọi hệ thống nhận được một tham số không hợp lệ.) ' –

5

Term::Size::Any có vẻ là những gì bạn đang theo dõi.

+0

Không phải là một phần của lõi Perl, nhưng vẫn tốt đẹp để biết về –

+1

Có một phiên bản thuần túy perl. Bạn không nên cần một trình biên dịch để cài đặt nó. – Dan

+0

@Dan: Oh ... Tôi sẽ có một cái nhìn sau đó :-) –

6

Nếu bạn muốn tạo thanh tiến trình, đừng đổ mồ hôi chi tiết. Sử dụng một trong nhiều số progress bar modules on CPAN và được thực hiện với nó.

+0

+1 cho câu trả lời * cấp cao hơn *. Quá xấu thuật ngữ :: ProgressBar cũng cần thuật ngữ :: ReadKey :-( –

4

Điều này rõ ràng phụ thuộc vào nền tảng này, nhưng một giải pháp rất đơn giản mà làm việc ra khỏi hộp trên Linux là thế này:

my $width = `tput cols`; 
+0

Điều này làm việc ngay cả trên Cygwin! Thx! – TrueY

Các vấn đề liên quan