On Aug 24, 9:03 am, [EMAIL PROTECTED] (Paul Lalli) wrote:

snip

>
> 'our', like 'my', is lexically scoped.  Its effects are terminated
> when the innermost enclosing block ends.  So if you're using the same
> package variable in two different blocks, you have to use 'our' in
> each of them:
>

Yes, that was a big revelation.  I wasn't aware that declaring our in
a block made a difference.  I thought that our meant it could be
declared once and used anywhere no matter where it was declared.

snip

> Your syntax for 'our' is confusing at best.  Just declare it once, at
> the very top of your program.

Yes, I started declaring our at the beginning.  Much clearer.

> From the output however, it looks like
> you have one of the older versions of DBI that Randal mentioned in his
> post.  That is, you cannot do what I suggested.  You have to make an
> explicit copy.
>
> my @stash;  #there's no reason this has to be 'our' to begin with.
> while (my $array_ref = $sth1->fetchrow_arrayref) {
>     push @stash, [ @{$array_ref} ];}
>

No, the version of DBI that I am using is very current so apparently
the DBI book is current on that issue also.  Using your code above
(same as book) worked fine.

> Again.  Stop using 'our' all over the place.  Declare your variables
> once, at the beginning of your program, if it's being used throughout
> the program.

Yep, got it the first time.

> > # 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)
>
> And what is the output of that?  If $array_ref->[5] is undefined, then
> you do not have six elements in your result arrays, which means you're
> using a different query than the one you originally posted, and you'll
> have to adjust your code accordingly.
>

Yes, when I was experimenting I unknowingly deleted the first string
in my SQL, which made the reference to [5] nonsensical.  Sorry.

> I wouldn't say "works" here.  I would say nothing more than "doesn't
> generate compiler errors". This doesn't do what you think it does.
> This creates a reference to an *array* that contains the keys and
> values of your hash.  You don't want to do that.  You want to create a
> reference to a *hash*.  To do that, we use { } instead of [ ]
>
> push @stash, { %{$hash_ref} };
>

Changed my code to this:
while (my $hash_ref = $sth1->fetchrow_hashref()) {
push @stash, { %$hash_ref };  #works, copies hash contents
}

> Right. All these messages are because you put array refs into @stash
> rather than hash refs.

Thanks again for all your help.  I still need to digest all of the
posts regarding scope, but I understand it better than two days ago.


--pete link


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


Reply via email to