Perl — полноэкранная прокрутка

Было интересно, есть ли способ, чтобы вывод в Perl через командную строку прокручивался «страница за раз»; нравится меньше/больше в *Nix. Я нашел что-то близкое в архивах stackoverflow, но я не думаю, что это сработает для меня.

Мне нужно вывести, чтобы определить размер экрана и узнать, что такое «полный экран», будь то маленькое окно или действительно полноэкранное окно, и иметь возможность делать это на маленьких или больших мониторах.

Кто-то сослался на модуль Perl Term::Pager - может быть, кто-то может помочь с этим. Однако нигде я не видел ничего такого, как «авто» или что-то, чтобы вывод знал, что такое настоящий полноэкранный режим. Причина в том, что из-за объема вывода, который будет генерировать программа (из-за дизайна), мне нужна функция «пейджинга».

Код от 04 декабря, 9:45 МСК

open MORE, '|more' or die "unable to start pager";
    open my $fh, '<', $file or die "can't open <$file> for reading $!"; {
    local $/ = "TYPE:\n";
    while ( my $record = <$fh> ) {
        [ .. snip snip ...]

Как мне сделать это с другим открытым заявлением?


person drewrockshard    schedule 04.12.2010    source источник
comment
Я неправильно понял вопрос. Извинения. Пожалуйста, игнорируйте закрытое голосование.   -  person Sinan Ünür    schedule 04.12.2010
comment
Нет, это вопрос о Perl. Я хочу, чтобы это делала программа, а не командная строка ОС — я не передаю ей никаких команд; Я запускаю его, и приложение perl выполняет пейджинг.   -  person drewrockshard    schedule 04.12.2010
comment
Будет делать :) спасибо за обновление вашего комментария.   -  person drewrockshard    schedule 04.12.2010
comment
Я понятия не имею, что вы имеете в виду, делая это с другим открытым заявлением. То, как вы получаете свой ввод, не имеет ничего общего с тем, как вы печатаете свой вывод. Вам нужно открыть пейджер только один раз, а затем просто продолжать печатать на нем.   -  person cjm    schedule 05.12.2010


Ответы (2)


просто направьте вывод в less или more:

open MORE, '|more' or die "unable to start pager";
print MORE "hello $_!\n" for 1..1000;
person salva    schedule 04.12.2010
comment
Я обновил свой вопрос. Я проверил, что это работает, однако в моей среде это не сработает, но, возможно, вы знаете, как исправить вложенные открытые операторы. - person drewrockshard; 04.12.2010

#!/usr/bin/env perl -CLA
use 5.010;
use utf8;
use strict;
use autodie;
use warnings qw< FATAL all >;
use open qw< IO :utf8 :std>;
use sigtrap qw< stack-trace normal-signals error-signals >;
END { close STDOUT }

if (-t STDOUT) {
    my $pager = $ENV{PAGER} || "less";
    open(STDOUT, "| $pager");
}

Если вы предпочитаете быть чертовски раздражающим, как Python или Java:

use Carp;
$^W = 1;
local $SIG{__WARN__} = sub { confess "untrapped warning" };

Это должно завоевать вам друзей в определенных кругах постмодернистских снобов, но не мне судить, цените ли вы их уважение.

person tchrist    schedule 04.12.2010
comment
Не уверен, что вы прочитали мое обновление к исходному вопросу - мне нужно вывести страницу, но она читается из файла, поэтому мне нужно знать, как с этим справиться. - person drewrockshard; 04.12.2010
comment
Я видел, как вы вставляли подобный код раньше. Я не прошу вас переписывать мой код. Если вы хотите дать мне идеи или примеры кода, пожалуйста, придерживайтесь моего текущего кода; это делает его таким запутанным, когда вы включаете кучу других вещей. Мне нужно просто знать, как выводить все, что находится в цикле while; перечитайте весь мой вопрос. Ваше решение не имеет для меня никакого смысла. - person drewrockshard; 04.12.2010
comment
@Drew: я сделал так, как ты просил. Почему ты говоришь иначе? Какая часть ввода/вывода непонятна? Вы не умеете читать строчку или не умеете писать строчку? Поскольку вы упомянули только вывод пейджинга, я предполагаю, что вы позаботились о входной стороне. Итак, скажите мне, какая именно часть print уравнения вас смущает? Если мне приходится использовать каждый бит ввода-вывода, то вы ПРЯМО требуете, чтобы я переписал для этого ваш код. Откровенно говоря, если вы не можете справиться с одним print утверждением, никакая помощь не принесет вам ничего, кроме вреда. - person tchrist; 04.12.2010
comment
Я все еще изучаю это и скоро вернусь к этому. - person drewrockshard; 28.01.2011