如何在Perl中检索终端宽度?

Ste*_*epp 9 terminal perl

我想输出一个进度条,但如何在Perl中检索终端宽度?

核心Perl解决方案将是首选,因为我无法访问编译器,只需已安装的5.8.2 Perl.

Mat*_*all 27

Perl附带的FAQ解答了这个问题.如果你跑perldoc -q "screen size",你会得到以下:

如何获得屏幕尺寸?

如果您Term::ReadKey从CPAN安装了模块,则可以使用它来获取字符和像素的宽度和高度:

use Term::ReadKey;
($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
Run Code Online (Sandbox Code Playgroud)

这比原始的"ioctl"更便携,但不是说明性的:

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";
Run Code Online (Sandbox Code Playgroud)

因此,如果您需要纯Perl解决方案,可以使用最后一个解决方案,或者如果您希望在代码中使用更简单的解决方案但需要更多的前期设置,则可以从CPAN 安装Term :: ReadKey.


ror*_*rjb 8

这显然取决于平台,但在Linux上开箱即用的非常简单的解决方案是这样的:

my $width = `tput cols`;
Run Code Online (Sandbox Code Playgroud)


bri*_*foy 6

如果您想制作进度条,请不要赘述.使用CPAN上的众多进度条模块之一并完成它.


Dan*_*Dan 5

Term :: Size ::任何看起来都是你想要的.