2010-12-04 30 views
0

Je me demandais s'il y avait un moyen de faire en sorte que la sortie de perl via la ligne de commande soit défilante "page à la fois"; comme moins/plus dans * Nix. J'ai trouvé quelque chose de proche dans les archives de stackoverflow, mais je ne pense pas que ça marchera pour moi. Je dois sortir pour détecter la taille de l'écran et savoir ce qu'est le "plein écran", qu'il s'agisse d'une petite fenêtre ou d'une fenêtre plein écran, et pouvoir le faire sur des moniteurs de petite ou grande taille.Perl - Défilement plein écran

Quelqu'un a référencé le module Perl Term :: Pager - peut-être que quelqu'un peut aider avec ceci. Cependant, nulle part je n'ai vu quoi que ce soit comme "auto" ou quelque chose pour que la sortie sache ce qu'est un vrai plein écran. La raison en est due à la quantité de sortie que le programme va générer (en raison de la conception), j'ai besoin d'une fonctionnalité de "pagination".

Code comme de 12/4 09h45 CST

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 ...] 

Comment pourrais-je faire de manière à une autre déclaration ouverte?

+0

J'ai mal compris la question. Excuses. S'il vous plaît ignorer le vote serré. –

+0

Non, il s'agit d'une question à propos de Perl. Je veux que le programme le fasse, pas la ligne de commande du système d'exploitation - je ne lui envoie aucune commande; Je l'exécute et avoir l'application Perl faire la pagination. – drewrockshard

+0

Will do :) merci de mettre à jour votre commentaire. – drewrockshard

Répondre

2

tuyau juste la sortie moins ou plus:

open MORE, '|more' or die "unable to start pager"; 
print MORE "hello $_!\n" for 1..1000; 
+1

J'ai mis à jour ma question. J'ai vérifié que cela fonctionne, cependant, dans mon environnement, cela ne fonctionnera pas, mais peut-être que vous sauriez comment corriger l'imbrication des instructions ouvertes. – drewrockshard

2
#!/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"); 
} 

Si vous préférez être diablement ennuyeux comme Python ou Java:

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

Cela devrait vous gagner amis dans certains snob-cercles postmodernistes, mais si vous estimez leur estime n'est pas à moi de le dire.

+1

Je ne sais pas si vous avez lu ma mise à jour à la question d'origine - J'ai besoin de "page" de sortie, mais c'est la lecture d'un fichier, donc j'ai besoin de savoir comment gérer cela. – drewrockshard

+1

Comment gérer quoi? – tchrist

+0

Je vous ai vu coller du code comme ça avant. Je ne vous demande pas de réécrire mon code. Si vous souhaitez me donner des idées ou des exemples de code, veuillez respecter mon code actuel. Cela le rend si déroutant quand vous incluez un tas d'autres choses. J'ai juste besoin de savoir comment faire la page de tout ce qui est dans une boucle while; relis toute ma question. Votre solution n'a aucun sens pour moi. – drewrockshard