我编写的代码将使用perl中的Term :: Cap模块在第二行和第十列显示一条语句。
我尝试了以下代码
#!/apps/perl/5.8.9/bin/perl
#
use strict;
use warnings;
require POSIX;
use Term::Cap;
my $termios =new POSIX::Termios;
$termios->getattr;
my $ospeed =$termios->getospeed;
my $terminal = Tgetent Term::Cap {TERM=>undef, OSPEED=>$ospeed};
$terminal->Trequire(qw/ce ku kd/);
$terminal->Tgoto('cm',5,2);
print "Hello World\n";
$terminal->Tputs('c1');
我得到的输出没有我指定的任何行和列位置。还有Trequire()和Tgetent()会做什么。也可以在(r1,c1)中显示Hello,在(r1,c2)中显示World。
答案 0 :(得分:1)
我的原始答案部分不正确,我已更正。
Term::Cap模块用于处理简单的,过时的与终端相关的数据库。根据说明:
这些是用于从中提取和使用功能的低级功能。 终端能力(termcap)数据库。
该数据库可能不存在于Unix的现代实现中(例如Linux)。如果无法找到数据库文件,则perl模块使用infocmp -C
获取终端信息。
我认为您的示例基于文档,使用$FH
似乎有点误导。 perl中的print
语句只是进入标准输出,并且将没有任何定位,因为Tgoto
返回定位的控制字符。它可以通过两种方式用于定位:
print $terminal->Tgoto('cm',5,2);
或
$terminal->Tgoto('cm',5,2,*STDOUT);
您也可能还希望自动刷新标准输出以避免缓冲效应,请参见下面的完整示例,该示例还具有正确使用Trequire
的功能:
use Term::Cap;
use strict;
my $ospeed = 9600;
my $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed };
$terminal->Trequire(qw/cl cm/);
STDOUT->autoflush(1); ### turn off buffering
print $terminal->Tputs('cl'); ### clear screen
my ($row, $col) = (16, 10);
foreach my $word (reverse(qw(ALL YOUR TERMCAP ARE BELONG TO US))) {
sleep(1);
print $terminal->Tgoto('cm', $row, $col--); ### position cursor
print $word;
}
print $terminal->Tgoto('cm', 0, 18);
Trequire
正在检查您正在使用由短termcap character codes表示的程序中使用的上限功能的条款。在上面的程序中:cl
表示清晰屏幕和主光标,cm
表示位置光标。如果终端不支持指定的列表,它将抛出异常并终止程序。
此空间中用于Unix的古代更高级别库被称为curses,用于vi
之类的“全屏”命令。其最新版本为ncurses。我建议您在CPAN上搜索诅咒,以找到具有适合您的用例的功能。