http://qs321.pair.com?node_id=134389

oaklander has asked for the wisdom of the Perl Monks concerning the following question:

I have a script that gives me the files and directory listing but I need it to print page by page because some of the outputs are very large. I could do the more command in unix but what would I use for a pc??
use File::Find qw(finddepth); die "GIVE DIRECTORY NAME AS AN ARGUMENT\n" unless @ARGV; *name = *File::Find::name; finddepth \&lis, @ARGV; if ( !-d ) { print "DIRECTORY NOT FOUND!\n"; exit(0); } else { sub lis { if (!-l && -d _) { $i++; print "$name is a DIRECTORY\n"; } else { $j++; print "$name\n"; } } $x=$i+$j; print "\nDIRECTORY COUNT = $i\n"; print "FILE COUNT = $j\n"; print "TOTAL RECORD COUNT = $x\n"; }
I tried putting a for loop for STDIN in this but it didnt work:
foreach($y=0) { print "$name is a DIRECTORY\n"; unless( $y++ % 80 ) { <STDIN>;
Please advise.

Replies are listed 'Best First'.
Re: Output question
by hotshot (Prior) on Dec 26, 2001 at 18:01 UTC
    I don't know if you have a simple solution here. I guess you'll have to implement a pager of your own (like more or less etc.), and that's not so simple, you'll need to read the list to an array or any other structure and output it to the screen according to the size and width of the window. Maybe someone here will have a better solution for you.
    Goodluck

    Hotshot
      I don't see why you should write your pager as '| more' will work both on unices and windoze...

      But, If you want to do it anyway, a simple test in front of each print :
      if(++$line > $LINEMAX) { $line=0; getc; }

      should be enough for simple/small scripts...
      Or to be a little bit cleaner, using print2 instead of print, whith print2 defined like this :
      sub print2 { if(++$line > $LINEMAX) { $line=0; getc; } print @_; }

      UPDATE :
      Term::ReadKey May be more appropriate than getc.
      Anyway you got the idea...
      UPDATE2 :
      This answer is for oaklander, I replied to the wrong post. Apologizes (especially to Hotshot).

      "Only Bad Coders Code Badly In Perl" (OBC2BIP)
        Don't assume that more is the right pager to use. It irritates those of us who joke that less is more. Here is a better way:
        use vars qw(%Config); use Config qw(%Config); print "My pager is $Config{pager}\n";
        arhuman,

        Thanks for you quick response and answer to my question! It now works the way I wanted.

        Can you please explain what the 'getc'is??

        Also If I wanted to use the 'more' command, where would I put it in my script?? I tried several areas and it didnt work.

IO::Page
by chip (Curate) on Dec 27, 2001 at 02:16 UTC
    You might find IO::Page useful.

        -- Chip Salzenberg, Free-Floating Agent of Chaos