Очистить экран после вывода в Perl - PullRequest
1 голос
/ 20 февраля 2012

Я хотел бы очистить вывод после выполнения сценария, и все выходные данные не должны отображаться на экране моего терминала.

Скажем, у меня есть следующий пример

#!/usr/bin/perl
print "HAI \n";
sleep 5;

Если я выполню вышеуказанный скрипт

# ./file
HAI
#

Хотелось бы, чтобы вышеприведённый вывод был

# ./file
#

HAI Должен отображаться в течение 5 секунд, он должен быть удален, и в терминале не должно быть вывода, как замазка.

Ответы [ 6 ]

4 голосов
/ 20 февраля 2012

Как уже говорилось, просто установите $ | истинное значение автоматически очистит ваши результаты.

Когда вы говорите: «HAI должен отображаться в течение 5 секунд, и он должен быть удален, и в терминале не должно быть вывода, как замазка.», Вы описываете фактическое удаление печатного текста с экрана.

Для этого вам нужно использовать специальный вывод. Смотрите Term :: ANSIScreen для одного модуля perl, который поможет вам сделать это.

Вот код, который делает то, что вы ищете:

use strict;
use Term::ANSIScreen qw/:cursor :screen/;

$| = 1;

savepos;
print "HAI";
sleep 5;
loadpos;
clline();
3 голосов
/ 20 февраля 2012

Этот код выполняет определенный трюк, который, я думаю, вам нужен:

$| = 1;       # set autoflush on STDOUT to avoid buffer problems
print "HAI "; # note no newline
sleep 5; 
print "\r      \n";'

\r переместит курсор назад к началу строки и затем перезапишет то, что было написано ранее.1006 * Но это что-то вроде хака.Вы, вероятно, ищете что-то вроде Curses .

2 голосов
/ 29 июля 2012

Я использую

 system("clear"); 

Надеюсь, это поможет!

1 голос
/ 21 февраля 2012

Я понял, мы можем получить, вызвав функцию clup (); , Во всяком случае, еще раз спасибо за каждого

use strict;
use Term::ANSIScreen qw/:cursor :screen/;

$| = 1;

savepos;
print "HAI";
print "HAI";
print "HAI";
print "HAI";
sleep 2;
loadpos;
clup();

Это сработало для меня:)

1 голос
/ 20 февраля 2012

Что означает очистка

Поскольку уже два ответа неправильно понимают ваш вопрос, позвольте мне указать: слово «очистить» в контексте perl (и не только) означает принудительную распечаткубуферизованный вывод.Чтобы понять, о чем идет речь, попробуйте что-то вроде

for(1..60) {
print "a";
sleep(1);
}
print "\n";

Вопреки ожиданиям, в течение 60 секунд вы не получите никакого вывода, а затем 60 букв a.Это связано с тем, что Perl буферизирует вывод stdout и отправляет его только при новой строке, при закрытии файла или при заполнении буфера.И действие по фактической отправке этого буфера называется сбросом, по той или иной причине.

Установка $ | = 1 ($ | иногда называется AUTOFLUSH, и его установка означает «буфер flush stdout для каждого напечатанного символа»).») Перед этими действиями, как предложено выше, это поведение меняется, но, похоже, оно не связано с реальной проблемой, с которой вы столкнулись.

Очистка экрана

В общем случае нетспособ очистить вывод.В частности, если вы перенаправите скрипт в файл, такой как

perl myscript.pl > somefile.txt

и напечатаете что-то, то это что-то попадет в somefile.txt независимо от того, что вы делаете.

Когда выводом является экран илиКонсоль есть много способов, но они зависят от того, что это за консоль.Во многих случаях отправка в соответствии с предложенным TLP подойдет.В других случаях вы можете использовать управляющие коды терминала (которые упакованы библиотекой curses).

Но также будут случаи, когда это не поможет, например, тот, который я уже упоминал (когда вы выводите в файл) или когда вы используете какую-то несовместимую консоль (часто случается, что скрипт запускается из текстового редактора или IDE).

Итак, подведем итог:

  • , если вы действительнонеобходимо отменить вывод, пересмотреть свой дизайн,

  • , если вы пишете какой-нибудь текстовый индикатор выполнения или что-то подобное для интерактивного сценария, используйте \ r или рассмотрите возможность перехода к Curses или, возможно, Term :: экран .Или проверьте доступные модули более высокого уровня, такие как Term :: ProgressBar

1 голос
/ 20 февраля 2012

$| - переменная, управляющая поведением сброса.Проверьте это здесь

Просто добавьте эту строку до / после вашего print.

$| = 1;

Если вы используете xterm, последовательность символов \e[2Jиспользуется для очистки всего окна терминалаВы можете

$| = 1;
print "anything";
sleep 5;
print "\e[2J";

Для другого терминала вы можете найти последовательность символов соответствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...