On Thu, 8 Jun 2000 11:51:16 -0400, Eric Rainey wrote: >and I say print ${$$ref[2]}[0]; > >Then it prints nothing, but suddenly $ref is now > > $ref-> [ > anon1->[0,1,2], > anon2->[0,1,2], > anon3->[] > ] > >and if you have a conditional which checks for the existence $ref[2] >being not true to stop a loop, suddenly you're toast. > >Is this behavior helpful sometimes? Sure it is. It's a feature called "autovivication". Suppose @$ref only had elements 0 and 1. And then you do: push @{$ref->[2]}, 'boo!'; In this case, it will do the right thing (IMO), and create a new empty anonymous array, at $ref->[2], and add 'boo!' in it, as the first element. It's even more useful with hashes. Look at this example: #!perl -w $\ = "\n"; use Data::Dumper; while(<DATA>) { chomp; my($key, $value) = split /\s+/, $_, 2 or next; push @{$related{$key}}, $value; } print Dumper(\%related); __DATA__ Fred Wilma Barney Betty Barney Bam Bam Fred Dino Fred Pebbles Imagine how complicated the script would have to be without autovivication! I can understand the gripe about this autovivication when only trying to *read* a value. You could call it a bug. In you particular case, you may get around it by doing print ref($ref[2]) && ${$$ref[2]}[0]; which also has the advantage of eliminating a possible "use of uninitialized value" warning. p.s. I prefer the syntax $ref->[2][0] over what you've used. print ref($ref->[2]) && $ref->[2][0]; -- Bart. ==== Want to unsubscribe from this list? ==== Send mail with body "unsubscribe" to macperl-anyperl-request@macperl.org