11
votes

Comment récupérer la largeur du terminal dans Perl?

Je veux émettre une barre de progression, mais comment puis-je récupérer la largeur du terminal dans Perl?

Une solution de noyau PERL serait préférable, car je n'ai pas accès à un compilateur, il suffit d'un Perl de 5,8,2% déjà installé.


4 commentaires

Vous avez toujours accès à un compilateur. Il n'y a pas de loi qui dit que vous devez la compiler sur le même hôte.


[Sarcastique] Normalement oui ... mais pas ici. Comme tout le monde sait que Java & Perl peut simplement être développé sur n'importe quelle case, il n'est pas nécessaire de disposer du même environnement (architecture de lecture) sur la plate-forme Dev que la production ... [/ sarcastique]


Pourquoi le sarcasme? Je vous donne une réponse sérieuse. Vos systèmes de développement et de production ne comptent pas vraiment. Vous pouvez traverser une compilation à l'une d'entre elles. Vous êtes ici pour obtenir de l'aide et je vous ai donné de l'aide gratuite, alors ne vous chierez pas dessus.


@brian: J'en suis désolé depuis que je ne voulais pas être sarcastique sur vous, mais plus sur PPL, cela ne me donne pas accès à un compilateur qui cible l'architecture de production (Hey, je savais que tu étais sérieux, J'ai même + 1'd).


4 Réponses :


5
votes

Terme :: Taille :: Tout semble être ce que vous 're après.


3 commentaires

Ne pas partie de Core Perl, mais toujours agréable de savoir


Il y a une version pure-perl. Vous ne devriez pas avoir besoin d'un compilateur pour l'installer.


@Dan: Oh ... je vais jeter un coup d'oeil alors :-)



30
votes

La FAQ qui navire avec Perl a la réponse à cette question. Si vous exécutez perdoc -q "taille de l'écran" code>, vous obtiendrez ce qui suit:

Comment puis-je obtenir la taille de l'écran? strong> p>

Si vous avez Terme :: Readkey Code> MODULE INSTALLÉ À partir de CPAN, vous pouvez l'utiliser pour récupérer la largeur et la hauteur en caractères et en pixels: P>

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


5 commentaires

Comment exécutons-nous h2ph comme indiqué par le message d'erreur: ne peut pas localiser sys / ioctl.ph dans @inc (avez-vous exécuté H2PH?)


@Steve: Alors, que se passe-t-il lorsque vous essayez d'exécuter H2PH ?


@Ether: j'ai raté l'option -d de H2PH . Maintenant, il est indiqué ioctl.pl: ioctl tiocgwinsz (40007468: un appel système a reçu un paramètre qui n'est pas valide.)


J'aimerais noter que le Tiocgwinsz a fait pas Travailler sur BSD, mais "Beaucoup" Les gens copient déjà cette "solution" car il ne semble pas nécessairement nécessiter des modules supplémentaires. S'il vous plaît l'éviter.


Cela ne fonctionnera pas dans un maquillage. Apparemment, il s'agit d'un bug d'utiliser ce module dans tout ce qui n'a pas de terminal de contrôle et, bien sûr, il faut contrôler le terminal. Dommage - je me demande s'il y a une autre façon de le faire fonctionner. (Modifier: Faire probablement les colonnes et lignes d'exportation de Makefile fonctionnera, mais ce serait bien s'il est essayé TPCT ou STTY TAILLE).



6
votes

Si vous voulez faire une barre de progression, ne transpirez pas les détails. Utilisez l'un des nombreux Modules de barre de progression sur CPAN et être fait avec elle. < / p>


1 commentaires

+1 pour une réponse niveau supérieur . Dommage que le terme :: ProgressBar a besoin d'aussi terme :: readkey :-(



12
votes

Cela dépend évidemment de la plate-forme, mais une solution très simple qui fonctionne hors de la boîte sur Linux est la suivante:

my $width = `tput cols`;


0 commentaires