Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re: Passing a hash between subs

by Cabrion (Friar)
on Jan 30, 2003 at 16:49 UTC ( #231375=note: print w/replies, xml ) Need Help??


in reply to Passing a hash between subs

You should . .
use strict;
$ref in foo() is out of scope becaue it is my'ed in bar(). When bar() returns $ref is garbage collected.

OK folks, here his code with my comments added:

sub foo { ... ########## Note that $ref does not exist(it's undef) ####### my %locations = &bar($dbh); ## Note that $ref did not get passed back from bar ## ... ########## $ref->{'location'} is undef, but 'use strict;' ########## here would have said: "can't use undef as hash" my $location_text = $locations{$ref->{'location'}}; } sub bar { my $dbh = shift; my $sql_loc = qq|SELECT * FROM ndmw_location|; my $sth = $dbh->prepare($sql_loc); $sth->execute or die("..."); my %locations; ########## Note that $ref IS my'ed here ########### while (my $ref = $sth->fetchrow_hashref()) { my $id = $ref->{'id'}; my $location = $ref->{'location'}; $locations{$id} = $location; } $sth->finish; return %locations; ########## Note that $ref goes away here ########### }
And finally,

If I throw all the code into one sub and not try and split it into sub-subs, it all works as expected.

Yes, it does work for him. That's beacuse $ref does not go out of scope.

Updated To make the problem/solution more clear.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://231375]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (5)
As of 2021-05-11 15:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Perl 7 will be out ...





    Results (117 votes). Check out past polls.

    Notices?