2009-11-23 10 views
7

Quiero generar una barra de progreso, pero ¿cómo recupero el ancho de la terminal en Perl?¿Cómo recupero el ancho del terminal en Perl?

Se preferiría una solución Core de Perl, ya que no tengo acceso a un compilador, solo un 5.8.2 Perl ya instalado.

+5

Siempre se tiene acceso a un compilador. No hay ninguna ley que diga que debes compilarla en el mismo host. –

+0

[sarcástico] Normalmente sí ... pero no aquí. Como todo el mundo sabe que Java & Perl solo se puede desarrollar en cualquier caja, no es necesario tener el mismo entorno (arquitectura de lectura) en la plataforma de desarrollo que la de producción ... [/ sarcástico] –

+1

¿Por qué el sarcasmo? Te estoy dando una respuesta seria. Sus sistemas de desarrollo y producción realmente no importan. Puede compilar de forma cruzada con cualquiera de ellos. Estás aquí para pedir ayuda y te di ayuda gratis, así que no te metas en eso. –

Respuesta

26

Las preguntas frecuentes que se envían con Perl tienen la respuesta a esta pregunta. Si ejecuta perldoc -q "screen size", obtendrá el siguiente:

¿Cómo puedo obtener el tamaño de la pantalla?

Si ha instalado Term::ReadKey módulo de CPAN, puede utilizarlo para buscar a la anchura y la altura de los personajes y en píxeles:

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

Esto es más portátil que la "ioctl" en bruto, pero no como ilustrativa:

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

para que pueda usar el último si quieres una solución Perl puro, o instalar Term::ReadKey de CPAN si desea una solución más simple en su código, pero más configuración inicial.

+0

¿Cómo ejecutamos 'h2ph' como lo implica el mensaje de error:' No se puede ubicar sys/ioctl.ph en @INC (se ejecutó h2ph?) ' –

+0

@Steve: entonces, ¿qué ocurre cuando intentas ejecutar' h2ph'? – Ether

+0

@Ether: me perdí la opción '-d' de' h2ph'. Ahora dice 'ioctl.pl: ioctl TIOCGWINSZ (40007468: Una llamada al sistema recibió un parámetro que no es válido.)' –

5

Term::Size::Any parece ser lo que buscas.

+0

No es parte del núcleo de Perl, pero aún así es bueno saber acerca de –

+1

Hay una versión pura perl. No debería necesitar un compilador para instalarlo. – Dan

+0

@Dan: Oh ... voy a echar un vistazo, entonces :-) –

6

Si quiere hacer una barra de progreso, no se preocupe por los detalles. Use uno de los muchos progress bar modules on CPAN y termine con eso.

+0

+1 para una * respuesta de nivel superior *. Lástima que el Término :: ProgressBar también necesita Term :: ReadKey :-( –

4

Obviamente, esto depende de la plataforma, pero una solución muy simple que funciona fuera de la caja en Linux es la siguiente:

my $width = `tput cols`; 
+0

Esto funciona incluso en Cygwin! Thx! – TrueY

Cuestiones relacionadas