On Aug 18, 7:58 pm, [EMAIL PROTECTED] (Paul Lalli) wrote:

snip

>
> Is that seriously from the book?  UGH.  Just declare $array_ref in the
> proper scope, and there's no need to take a reference to a dereference
> of the reference.
>
> while (my $array_ref  = $sth1->fetchrow_arrayref) {
>     push @stash, $array_ref;
>
> }


Great - this worked fine.

>
> In this specific example, "data" is the sixth column in the SELECT
> query.  You would therefore access it by $array_ref->[5].
>

No luck here, I could not retrieve anything (example code below).


> I would generally recommend you use the fetchrrow_hashref method
> rather than fetchrow_arrayref, so that you can refer to the column by
> name.  This will prevent bugs in your code if you later change the
> query to add or remove columns.  With fetchrow_hashref, the return
> value is a reference to a hash rather than to an array:
>
> while (my $hash_ref = $sth1->fetchrow_hashref()) {
>     print $hash_ref->{data} . "\n";
>
> }

I was able to replicate this and also do a push to an array, but
again, I could not retrieve rows.


> I agree with other posters - you should read:
> perldoc perlref
> perldoc perlreftut
> perldoc perllol
> perldoc perldsc
>
> Paul Lalli

Thanks to all who suggested these perldocs - the perlreftut and
perllol were especially helpful.

I've learned more about references and also about scoping of variables
- now I'm doing "use strict" and it took a while to make it work
here.
A side question: why is it necessary to declare "our @variable" more
than once in a program?

The main problem is that I still can't retrieve data at will.
See below:

First, as an array - I tried commented-out options one at a time.
Msg is error message from Perl.

$sth1->execute();

while (my $array_ref = $sth1->fetchrow_arrayref) {
  push ((our @stash), $array_ref);  ##copy array contents
}

#use Data::Dumper 'Dumper';
#    print Dumper our @stash ; #Msg: $VAR19586 = $VAR1;

###dump stash contents
foreach my $array_ref (our @stash ) {
# print "Row: $array_ref->[5]\n"; #Msg:Use of uninitialized value in
concatenation
#  print $array_ref->[5]; #Msg: Use of uninitialized value in
concatenation
  print "Row:  @$array_ref\n"; #works, prints entire rows (from book)
}

foreach my $row (our @stash) {
# print "DATA: $row->[5]\n";  #Msg: Use of uninitialized value in
concatenation or string
# print "DATA: @$row->[5]\n"; #Msg: Use of uninitialized value in join
or string
#}

Now as a hash, which is what I would prefer, for the reasons stated by
Paul.

$sth1->execute();

while (my $hash_ref = $sth1->fetchrow_hashref()) {
#print $hash_ref->{data} . "\n";  # works, prints data
push our @stash, [ %$hash_ref ];  #works, copies hash contents
}

#use Data::Dumper 'Dumper';
#    print Dumper our @stash; #showed good results (see below)

foreach my $hash_ref (our @stash ) {
#print "Row: %$hash_ref\n";  #Msg:  Row: %ARRAY(0x13f88d44)
#print "Row: $hash_ref\n"; #Msg:  Row: %ARRAY(0x13f88d44)
#print %$hash_ref . "\n"; #Msg: 'Can't coerce array into hash at'
}

from hash Data Dumper:
$VAR790 = [
            'time_stamp',
            'Mon Mar 05 2007 11:07:11',
            'message_event',
            'MESSAGE OUT',
            'message_no',
            '12101589',
            'data',
' MSH|^~\\&|HUB|HOSP.MED.XXXX.EDU|PM3.0|HOSP.MED.XXXX.EDU|200
',A|AA|9}|MESSAGE ACCEPTED||
            'message_index',
            '36314470'
          ];
$VAR791 = [
            'time_stamp',
            'Mon Mar 05 2007 11:07:11',
etc.....

What am I doing wrong?
Thanks for all the help.

Peter Link


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to