in reply to Query Subroutine

You have not scoped @new_row to run_query(), so every time you call the function, you push values onto the same array. The solution to this is to write:

my @new_row;

... just before the while loop. I encourage you to scope all of your variables lexically in the tightest possible scope; it will help you avoid many problems like this.

Replies are listed 'Best First'.
Re^2: Query Subroutine
by Fuism (Beadle) on Aug 08, 2005 at 03:50 UTC
    So do you mean like this?
    sub run_query { my ($query) = @_; # Run Query print "$query\n"; ### Prepare a SQL statement for execution $prepare_exe = $dbv->prepare( "$query"); ### Execute the statement in the database $prepare_exe->execute; my @new_row; # Each element will be comma seperated while ( @row = $prepare_exe->fetchrow_array( ) ) { $string = join(",", @row); $string = $string."\n"; #print "$string\n"; # Will contain all rows push(@new_row, $string); } return @new_row; $prepare_exe->finish; }
    Thanks...

      Right. You ought to do that for the other lexical variables too, to avoid similar problems (though with them being all scalars and you not calling any other code likely to change them, you're safe for now). I would write that subroutine more like:

      sub run_query { my ($query) = @_; my $sth = $dbv->prepare( $query ); $sth->execute(); my @new_row; while ( my @row = $sth->fetchrow_array() ) { my $string = join( ',', @row ); $string .= "\n"; push( @new_row, $string ); } return @new_row; }

      I removed the code after the return call because Perl will never execute it. (Further, if you exhaust the result set, as this code does, there's no need to call finish().)

        Chromatic thanks for the information.... I really appreciate it.