in reply to Re^5: Best way to send records to the browser?
in thread Best way to send records to the browser?

Thank you. I will give that a try.

In the meantime, I wrote this variation. The first loop basically works. However, just as you said, each row is getting overwritten. I guess I need to instantiate a new hash instance each time the program loops as you suggested.

while (@rray = $sth -> fetchrow_array) { $record = "record_$i"; %hash = ($record => {uid => $rray[0], fname => $rray[1], lname => +$rray[2]}); print $hash{$record} -> {uid}, qq/ /, $hash{$record} -> {fname}, q +q/ /, $hash{$record} -> {lname}, qq/\n/; $i += 1; } for ($i = 0; $i < 100; $i++) { print $hash{$i} -> {uid}, qq/ /, $hash2{$i} -> {fname}, qq/ /, $ha +sh2{$i} -> {lname}, qq/\n/; }

Can I simply save each new instance of %hash to a larger hash (say %hash2) each time the program loops? Or do I need to use hash references?

I think the second loop fails because the hash is getting overwritten in the first loop. I get these errors:

pass.cgi: Use of uninitialized value in print at ./pass.cgi line 85.

with each loop. I did notice that the last record is intact ... which now makes sense. So I guess I just need to eliminate the overwriting in the first loop. Is this right?

Thanks so much.

Replies are listed 'Best First'.
Re^7: Best way to send records to the browser?
by almut (Canon) on Jun 26, 2010 at 19:45 UTC

    You probably want

    $hash{$record} = {uid => $rray[0], fname => $rray[1], lname => $rray[2 +]};

    instead of

    %hash = ($record => {uid => $rray[0], fname => $rray[1], lname => $rra +y[2]});

    because the latter initializes the hash anew every time, so the old entries are lost.

    Also, in this particular case, another problem seems to be that in the first loop you're creating hash entries with keys as "record_$i", while in the second loop you're using plain numbers ($i).  Also, you probably mistyped $hash2{$i} when you meant $hash{$i}.

    More generally, there are two things that will likely save you lots of debugging time:

    • use strict; use warnings; to catch typos (like the above) and more
    • use Data::Dumper; ... print Dumper \%hash; for checking what's in a complex data structure.

      Thanks. That last bit of help was what I needed. I do have warnings and strict turned on btw. Never leave home without it.

      This syntax was a little tricky, but I now see how to build and retrieve HoH's. Thanks so much.

      For the sake of completeness, I'll post my final snippet of code here just incase someone else needs similar help.

      $i = 0; while (@rray = $sth -> fetchrow_array) { $record = "record_$i"; $hash{$record} = {uid => $rray[0], fname => $rray[1], lname => $rr +ay[2]}; #print $hash{$record} -> {uid}, qq/ /, $hash{$record} -> {fname}, +qq/ /, $hash{$record} -> {lname}, qq/\n/; $i += 1; } my ($key, $value); for ($i = 0; $i < 325; $i++) { $record = "record_$i"; $key = keys %hash; $value = $hash{$record} -> {fname}; print "key = record_$key, hash values = ", $hash{$record} -> {uid} +, ", ", $hash{$record} -> {fname}, ", ", $hash{$record} -> {lname}, " +\n"; }

      Now its time to take this HoH to TT2 and see if I can get my template to render it in the browser.

      BTW, I stumbled across an interesting Perl Module while working on this. See CG::Expand (it was new for me).

      Cheers

      Edited 6/26/10 @ 5:55 PM CST

      Sorry, I should've cleaned up that last block of code a bit before pasting it. Here is the edited version:

      # get number of records in %hash my $href = \%hash; my $records = scalar keys %$href; # print data from all records for ($i = 0; $i < $records; $i++) { $record = "record_$i"; print "key = $record, hash values = ", $hash{$record} -> {uid}, ", + ", $hash{$record} -> {fname}, ", ", $hash{$record} -> {lname}, "\n"; }