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

I have search script which I use for searching matches from flat file. It puts matches to array @found. How can I make it to show only 10 matches at the time, first 1 - 10 next 11 - 20, and so on?
PH

Replies are listed 'Best First'.
Re: Showing 10 lines at the time
by thinker (Parson) on Aug 26, 2002 at 07:35 UTC
    Hi,

    You could try a variation on this.
    #!/usr/bin/perl -w use strict; open FILE, "/usr/share/dict/words" or die $!; my @found=<FILE>; my $counter=0; for(@found){ print; unless (++$counter%10) {print "\npress return to continue\n"; <>; }; }
    cheers

    thinker
Re: Showing 10 lines at the time
by strat (Canon) on Aug 26, 2002 at 10:28 UTC
    1. Keeping track of where you are: You could use a cgi-parameter (I like to use one with the name 'lastId') and set links like
    <a href="$script?lastId=$lastId-$ammountOfDataToDisplay>Last entries</ +a> <a href="$script?lastId=$lastId+$ammountOfDataToDisplay>Next entries</ +a>
    (Btw: I just used $lastId-$ammountOfDataToDisplay to show the value; perhaps you have to calculate it before writing the links).

    2. If you used a database instead of flatfiles, maybe the SQL-Command LIMIT might help you getting the correct slices of data, e.g.

    SELECT * FROM table ORDER BY id DESC LIMIT $lastId, $ammountOfDataToDisplay
    But maybe this will also work with DBI and DBD::CSV, I don't know.
    Then just calculate the new $lastId (now better called $actualLastId) and check if you have to write the links, e.g. something like the following:
    if ($lastId > 0) { my $newId = $lastId - $ammountOfDataToDisplay; print qq~<a href="$scriptname?lastId=$newId">Last</a>~; } if ($outputCount == $ammountOfDataToDisplay) { my $newId = $lastId + $ammountOfDataToDisplay; print qq~<a href="$scriptname?lastId=$newId">Next</a>~; }
    I haven't tested these codes, but hope they will give you an idea on what to do.

    Best regards,
    perl -e "s>>*F>e=>y)\*martinF)stronat)=>print,print v8.8.8.32.11.32"

Re: Showing 10 lines at the time
by hotshot (Prior) on Aug 26, 2002 at 07:36 UTC
    Your question isn't so clear, do you want to show 10 matches, do something and than show the next 10. If that's what you need than you can try:
    my $j = 0; while (1) { for (my $i = 0; $i < 10 && $j < @found; $i++) { $j++; print $found[$j], "\n"; } # do something last if ($j == @found); }
    UPDATE: thinker's suggestion is better, I didn't understood you question, sorry.

    Hotshot
      Yes, the idea is like that, but I'd like to do it with a browser. Printing out 10 matches plus a link with text "next 10 >>".
      PH
(jeffa) Re: Showing 10 lines at the time
by jeffa (Bishop) on Aug 26, 2002 at 13:59 UTC
    If this is for a CGI script, then check out HTML::Pager (JavaScript alert, however). If this is for a command line script, then check out Data::Page.

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)
    
•Re: Showing 10 lines at the time
by merlyn (Sage) on Aug 26, 2002 at 13:53 UTC