I want to output a progress bar, but how do I retrieve the terminal width in Perl?
A core Perl solution would be preferred, since I don't have access to a compiler, just an already installed 5.8.2 Perl.
I want to output a progress bar, but how do I retrieve the terminal width in Perl?
A core Perl solution would be preferred, since I don't have access to a compiler, just an already installed 5.8.2 Perl.
The FAQ which ships with Perl has the answer to this question. If you run perldoc -q "screen size"
, you'll get the following:
How do I get the screen size?
If you have
Term::ReadKey
module installed from CPAN, you can use it to fetch the width and height in characters and in pixels:use Term::ReadKey; ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
This is more portable than the raw "ioctl", but not as illustrative:
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 you can use the last one if you want a pure Perl solution, or install Term::ReadKey from CPAN if you want a simpler solution in your code but more up-front set-up.
If you want to make a progress bar, don't sweat the details. Use one of the many progress bar modules on CPAN and be done with it.