Thanks all for the explanation, and to Uri for the article, but especially to Greg, who has given perhaps the most cryptic and disturbing intro to a technical explanation ever:
> you've glimpsed the dark side of autovivification. > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED]] On Behalf Of > [EMAIL PROTECTED] > Sent: Thursday, February 06, 2003 11:23 AM > To: Joel Gwynn > Cc: [EMAIL PROTECTED] > Subject: Re: [Boston.pm] Hash of hashes question > > > you've glimpsed the dark side of autovivification. > > when you say unless($apples{$t}{weight}) > you're fetching a boolean value. > Perl gives you one free level of autovivification > when you get/fetch a value. > so it autovivifies a hash at key $t when > you try and test for a sub key 'weight'. > > as far as I can tell, you MUST first test > for existence of $apples{$t} else you get > one free level of autovivification, and > it creates an empty hash and then fetches > the value for key 'weight', which is > undef, which stringifies to ''. > > i.e. > > foreach my $t (@test) > { > next unless(exists($apples{$t})); > print "$t not found\n" unless $apples{$t}{weight} > } > > > greg > > Joel Gwynn wrote: > > > > Wow. This is driving me crazy. I'm looking for a value in > one of the > > keys in a hash, like so: > > > > my %apples = (macintosh => {weight => '10lb', cost => '5'}, > > red_delicious => {weight => '15lb', cost => '2'}, > > fuji => {weight => '12lb', cost => '7'}); > > > > my @test = qw(granny_smith crabapple); > > > > foreach my $t (@test){ print "$t not found\n" unless > > $apples{$t}{weight} } print "\n-----------------------\n"; > foreach my $a (keys %apples){ > > print "$a: weight: $apples{$a}{weight}\n"; > > } > > > > And what I get output is this: > > > > granny_smith not found > > crabapple not found > > > > ----------------------- > > granny_smith: weight: > > fuji: weight: 12lb > > crabapple: weight: > > red_delicious: weight: 15lb > > macintosh: weight: 10lb > > > > Now, what's driving me crazy is that the two test values are being > > added to the hash, simply by looking for $apples{$t}{weight}. If I > > simply look for $apples{$t}, like so: > > > > foreach my $t (@test){ print "$t not found\n" unless $apples{$t} } > > > > new hash members are not created. Why should this be? > > > > _______________________________________________ > > Boston-pm mailing list > > [EMAIL PROTECTED] http://mail.pm.org/mailman/listinfo/boston-pm > > -- > Greg London > x7541 > > > \|/ ____ \|/ > ~@-/ oO \-@~ > /_( \__/ )_\ > \__U_/ _______________________________________________ > Boston-pm mailing list > [EMAIL PROTECTED] http://mail.pm.org/mailman/listinfo/boston-pm > _______________________________________________ Boston-pm mailing list [EMAIL PROTECTED] http://mail.pm.org/mailman/listinfo/boston-pm

