簡體   English   中英

如何在 perl 中使用 Term::Cap 模塊在特定行和列顯示語句

[英]How to display a statement at a specfic row and column using Term::Cap module in perl

我編寫了一個代碼,該代碼將使用 perl 中的 Term::Cap 模塊在第 2 行和第 10 列顯示一條語句。

我試過下面的代碼

#!/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。

我原來的答案有部分不正確,我已經更正了。

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字符代碼 在上面的程序中: cl表示清除屏幕和主頁光標, cm表示位置光標。 如果終端不支持指定的列表,它將拋出異常並終止程序。

這個空間中用於 unix 的古老的高級庫被稱為 curses,用於“全屏”命令,如vi 這個的現代版本是ncurses 我建議在CPAN上搜索curses,以找到具有適合您用例的功能的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM