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

G'Day. Seems I've lost my path to brain. Thought it was #!/usr/bin/brain -Tw

Dilemma ->
I'm querying a data base and I'm getting and expecting three rows of data. I'm trying to get the first row to be put in an array (@x). Then I want the second row in array y. And eventually I want the third row in array z.

$sth->execute() or die $sth->errstr; my $row = 0; while (my @result = $sth->fetchrow_array()) { last if $row++ >= 3; if ($row = 1){ @x = @result; } if ($row = 2){ @y = @result; } if ($row = 3){ @z = @result; } } print qq(@x<br><br>); print qq(@y<br><br>); print qq(@z<br><br>); $sth->finish();
If I put the print statement inside the while loop, each array prints all three rows. If I print outside the while loop, it prints only the last row for each array.

The complete return looks like this:
@result =
row 1 - data1
row 2 - data2
row 3 - data3

I need to get it to do this:
@x = row 1 - data1
@y = row 2 - data2
@z = row 3 - data3

Any suggestions and/or help would be most appreciated.


Replies are listed 'Best First'.
Re: pushing individual rows of return (DBI) into seperate arrays
by Mr. Muskrat (Canon) on Aug 28, 2003 at 19:13 UTC
    Your if statements are true for each row because you use = instead of ==.
      Mr. Muskrat Thanks for the fresh pair of eyes. Can't believe I missed something so simple. Too much time staring at code.

      Thank you sir


        Hi peppiv,

        Like everyone else, at some time or other, I have been bitten by this. I have noticed lately around the monastery some people using the idiom

        if ( 1 == $row ){ ... }

        the reason being that if ( 1 = $row ){ ... } would yield an error. ( Can't modify constant item in scalar assignment )

        My first impression was that the construct was ugly, and counter-intuitive, but I feel my opinion changing. I haven't included it in any code, yet, but who knows what the future will bring? :-)

        Does anyone have any thoughts on whether the use of this construct should be encouraged?


Re: pushing individual rows of return (DBI) into seperate arrays
by tcf22 (Priest) on Aug 28, 2003 at 19:58 UTC
    Why not just use an array of arrays.
    $sth->execute() or die $sth->errstr; my @result_arrays; while (my @result = $sth->fetchrow_array()) { push(@result_arrays, \@results); } foreach(@results_arrays){ print qq(@{$_}<br><br>); } $sth->finish();
      And then, why not use the built-in tool to do that:
      $sth->execute; # I always set RaiseError so I don't have to keep sayin +g "or die..." my $result = $sth->fetchall_arrayref(); # calls ->finish too for (@$result) { print qq{@$_<br><br>}; }

      -- Randal L. Schwartz, Perl hacker
      Be sure to read my standard disclaimer if this is a reply.