On 4/5/06 Stewart Leicester wrote: >Bruce Van Allen wrote: >>Both >> defined $phash{"D"}[3] >>and >> exists $phash{"D"}[3] >> >>autovivify $phash{"D"}. >> >>- Bruce > >'defined' will autovivify, 'exists' will not. I'll leave it up to >Doug to decide if knowing that helps.
Oh? Try this: #!/usr/bin/perl -w use strict; my %hash = ( A => [qw/a0 a1 a2/], ); # $hash{A} if (defined $hash{A}[2]) { print "OK \$hash{A}[2] defined\n" } if (exists $hash{A}[2]) { print "OK \$hash{A}[2] exists\n" } # test defined() on $hash{B} if (defined $hash{B}[2]) { print "OK \$hash{B}[2] defined\n" } elsif (exists $hash{B}) { print "OK \$hash{B} exists: autovivified from defined()\n" } # test exists() on $hash{D} if (exists $hash{D}[2]) { print "OK \$hash{D}[2] exists\n" } elsif (exists $hash{D}) { print "OK \$hash{D} exists: autovivified from exists()\n" } __END__ prints: OK $hash{A}[2] defined OK $hash{A}[2] exists OK $hash{B} exists: autovivified from defined() OK $hash{D} exists: autovivified from exists() The autovivification is happening when the values are dereferenced. The expression exists $hash{D}[2] is testing the existence of the third element in the array ref ostensibly stored in $hash{D}, so $hash{D} gets autovivified to allow the test. 1; - Bruce __bruce__van_allen__santa_cruz__ca__