Как отобразить оператор в конкретной строке и столбце, используя модуль Term :: Cap в Perl - PullRequest
1 голос
/ 19 июня 2019

Я пишу код, который будет отображать оператор во 2-й строке и 10-м столбце, используя модуль Term :: Cap в perl.

Я пробовал приведенный ниже код

#!/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');

IЯ получаю вывод без какой-либо строки и позиции столбца, которые я конкретно.Также, что будут делать Trequire (), Tgetent ().Также возможно отображать Hello in (r1, c1) и World at (r1, c2).

1 Ответ

1 голос
/ 19 июня 2019

Мой первоначальный ответ был частично неверным, я исправил его.

Модуль Term :: Cap предназначен для управления простой устаревшей базой данных, связанной с терминалами. Из описания:

Это низкоуровневые функции для извлечения и использования возможностей из база данных возможностей терминала (termcap).

Эта база данных может отсутствовать в современной реализации Unix (например, Linux). Модуль perl использует infocmp -C для получения информации о терминале, если он не может найти файл базы данных.

Я думаю, что ваш пример основан на документации, которая вводит в заблуждение при использовании $FH. Оператор print в perl просто идет к стандартному выводу и будет лишен любого позиционирования, потому что 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 проверяет term inal, который вы используете способности cap , которые вы используете в программе, представленной короткими кодами символов termcap . В вышеприведенной программе: cl для очистки экрана и домашнего курсора и cm для позиционного курсора. Он выдаст исключение и завершит программу, если терминал не поддерживает указанный список.

Древние высокоуровневые библиотеки в этом пространстве для unix назывались curses и использовались для "полноэкранных" команд, таких как vi. Современная версия этого - ncurses . Я бы посоветовал поискать проклятия на CPAN , чтобы найти что-то, что имеет функции, подходящие для вашего варианта использования.

...