Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

push result into array

by djbryson (Beadle)
on Feb 26, 2007 at 21:07 UTC ( [id://602221]=perlquestion: print w/replies, xml ) Need Help??

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

I just want to push my results into an array the following doesn't work.
while (@result = $sth->fetchrow_array()) { push @result,@dept; }

Replies are listed 'Best First'.
Re: push result into array
by kyle (Abbot) on Feb 26, 2007 at 21:10 UTC

    push tries to add items to its first argument. Your loop is resetting @result each time through. You probably want something like:

    while (@result = $sth->fetchrow_array()) { push @dept, @result; }
Re: push result into array
by andye (Curate) on Feb 26, 2007 at 21:24 UTC
    Hi djbryson,

    Other people have already pointed out the issue around the arguments to push - I thought it might be worth adding that:

    What you're doing will put each column from the database into your array, one after another, and squdge them all together. E.g. if one set of results looked like this: (1, 2, 3) then after three fetches your array of results would look like this: (1, 2, 3, 1, 2, 3, 1, 2, 3)

    You might be better either
    a) putting a reference to @result onto @dept, like this: push @dept, \@result (or you could use fetchrow_arrayref), or
    b) using fetchall_arrayref

    Either way, instead of a data structure that looks like this: (1, 2, 3, 1, 2, 3, 1, 2, 3) I'd suggest using a data structure like this:

    ( [1, 2, 3], [1, 2, 3], [1, 2, 3] )
    as you'll find it easier to work with when you come to do whatever you're going to do with it. You can find more info about this kind of thing in perlref.

    HTH! a.

    update: of course, if you're only fetching one column at a time then the way you have it is already perfectly sensible, and not worth changing...

Re: push result into array
by ptum (Priest) on Feb 26, 2007 at 22:10 UTC

    Heck, why do extra work when DBI already does it for you?

    @dept = @{$sth->fetchall_arrayref()};

    Now @dept holds a bunch of array references, one for each of your rows. You can step through @dept, dereference the array reference, and go to town on the columns you need:

    use strict; use Data::Dumper; foreach my $thisrow (@dept) { if (ref($thisrow) eq 'ARRAY) { my @columns = @{$thisrow}; foreach (@columns) { # do something } } else { print "Hey! That's not an array reference!\n"; print Dumper($thisrow); } }

    Admittedly, that is a little more explicit than I would actually do in practice -- no need for @columns when you can just talk about $thisrow->[2], for example.

Re: push result into array
by EvanK (Chaplain) on Feb 26, 2007 at 21:11 UTC
    you probably have the arguments backward, check the docs. I assume you want to add @result onto @dept?
    while (@result = $sth->fetchrow_array()) { push @dept,@result; }

    __________
    Systems development is like banging your head against a wall...
    It's usually very painful, but if you're persistent, you'll get through it.

Re: push result into array
by philcrow (Priest) on Feb 26, 2007 at 21:11 UTC
    Perhaps @dept and @result are reversed? push adds to the first array whatever is in the list or array that follows.

    Otherwise, we'll need a little more description of what you are trying to do.

    Phil

      ugh, it was backwards... thanks guys

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://602221]
Approved by andye
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (6)
As of 2024-04-23 09:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found