2009-11-23 5 views
7

Ich möchte einen Fortschrittsbalken ausgeben, aber wie bekomme ich die Terminalbreite in Perl?Wie kann ich die Terminalbreite in Perl abrufen?

Eine Core-Perl-Lösung wäre vorzuziehen, da ich keinen Zugriff auf einen Compiler habe, nur einen bereits installierten 5.8.2 Perl.

+5

Sie immer Zugriff auf einen Compiler. Es gibt kein Gesetz, das besagt, dass Sie es auf demselben Host kompilieren müssen. –

+0

[sarkastisch] Normalerweise ja ... aber nicht hier. Da jeder weiß, dass Java & Perl einfach auf jeder Box entwickelt werden kann, muss auf der Entwicklerplattform nicht die gleiche Umgebung (Lesearchitektur) vorhanden sein als die der Production ... [/ sarcastic] –

+1

Warum der Sarkasmus? Ich gebe dir eine ernsthafte Antwort. Ihre Entwicklungs- und Produktionssysteme spielen keine Rolle. Sie können für beide eine Kreuzkompilierung durchführen. Du bist hier, um Hilfe zu bekommen und ich habe dir kostenlose Hilfe gegeben, also scheiße nicht drauf. –

Antwort

26

Die FAQ, die mit Perl geliefert wird, hat die Antwort auf diese Frage. Wenn Sie perldoc -q "screen size" ausführen, erhalten Sie die folgenden Schritte aus:

Wie erhalte ich die Bildschirmgröße?

Wenn Sie Term::ReadKey CPAN-Modul installiert ist, können Sie es verwenden, um die Breite und Höhe in Zeichen und in Pixel zu holen:

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

Dies ist mehr tragbar als der rohe „ioctl“, aber nicht als illustrativ:

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"; 

so können Sie die letzte verwenden, wenn Sie eine reine Perl-Lösung wollen, oder Term::ReadKey von CPAN installieren, wenn Sie eine einfachere Lösung wollen in deinem Code aber mehr Vor-Setup.

+0

Wie wir 'h2ph' ausführen, wie durch die Fehlermeldung impliziert:' Kann sys/ioctl.ph in @INC nicht finden (haben Sie ausgeführt h2ph?) ' –

+0

@Steve: Also was passiert, wenn Sie versuchen,' h2ph' zu starten? – Ether

+0

@Ether: ich verpasste die '-d' Option von' h2ph'. Jetzt heißt es 'ioctl.pl: ioctl TIOCGWINSZ (40007468: Ein Systemaufruf hat einen ungültigen Parameter erhalten.)' –

5

Term::Size::Any sieht aus, wonach Sie suchen.

+0

Nicht Teil des Kern Perl, aber immer noch schön zu wissen –

+1

Es gibt eine reine Perl-Version. Sie sollten keinen Compiler benötigen, um es zu installieren. – Dan

+0

@Dan: Oh ... Ich werde dann schauen :-) –

6

Wenn Sie einen Fortschrittsbalken machen wollen, schwitzen Sie nicht die Details. Verwenden Sie einen der vielen progress bar modules on CPAN und damit fertig sein.

+0

+1 für eine * übergeordnete * Antwort. Schade, der Term :: ProgressBar braucht auch Term :: ReadKey :-( –

4

Dies hängt offensichtlich von der Plattform, aber eine sehr einfache Lösung, die auf Linux aus der Box funktioniert, ist dies:

my $width = `tput cols`; 
+0

Das funktioniert sogar auf Cygwin! Thx! – TrueY

Verwandte Themen