http://www.perlmonks.org?node_id=231375


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.