我需要在Perl程序的终端中实时绘制图形。但我无法使用第三方模块。
我只需要使用ASCII字符绘制图形。
我有一些问题。
我的想法是在每个时间段根据数据垂直打印字符序列。向数组添加新值,而不是将其向右或向左移动。 (也许有更好的方法来做到这一点,请让我知道) 所以问题是:
如何获取当前终端窗口高度,而不是在打印值时使用它。当终端窗口大小发生变化时,应使用新的高度使其可扩展。
如何获取当前宽度并根据字符宽度计算它以获得迭代次数。
答案 0 :(得分:0)
这是一种不使用核心Perl之外的任何模块的方法。
use v5.10;
use Term::Cap ();
use Time::HiRes qw( sleep );
## See: perldoc -q "screen size"
require 'sys/ioctl.ph';
die "no TIOCGWINSZ " unless defined &TIOCGWINSZ;
open(my $tty_fh, "+</dev/tty")
or die "No tty: $!";
sub GetWinSize {
unless (ioctl($tty_fh, &TIOCGWINSZ, $winsize='')) {
die sprintf "$0: ioctl TIOCGWINSZ (%08x: $!)\n", &TIOCGWINSZ;
}
return unpack('S4', $winsize);
}
##
my $terminal = Term::Cap->Tgetent;
my $max = 100;
my @vals;
while (1) {
$terminal->Tgoto('cm', 0, 0);
push @vals, int(rand($max)); # get your vaue here
my ($height, $width) = GetWinSize();
$width -= 2;
my $slicewidth = $#vals <= $width ? $#vals : $width;
my $scale = $height / $max;
my $fmt = "%s" x $slicewidth;
for (my $i=0; $i < $height; $i++) {
printf "$fmt\n",
map { $_ * $scale < ($height - $i) ? ' ' : '*' }
@vals[-$slicewidth..-1];
}
sleep .5;
}