develooper Front page | perl.perl5.porters | Postings from April 2007

Re: [perl #42363] Extra elements created in multi-dimensional arrays

Thread Previous
Dominic Dunlop
April 9, 2007 09:39
Re: [perl #42363] Extra elements created in multi-dimensional arrays
Message ID:
On 2007–04–09, at 07:22, (via RT) wrote:
> While trying to write a program that makes use of a two-dimensional
> array (list of lists, to be exact), and trying to debug it, I ran into
> a possible bug.  I was trying to access a non-existing element,  
> outside
> of array boundaries, and this element, as well as all intermediate
> elements, were created for me.

It's not a bug; Perl's supposed to work this way: if you say you want  
to access a particular array element, Perl does its best to arrange  
things so that you can, even if that element does not exist. It's  
documented in passing in a number of places, under the name of  
"autovivification" (which you would never have guessed in a month of  
Sundays). See, for example, the perldata man page and, if you can  
easily look at Perl 5.8.8 or the third edition of "Programming Perl",  
perlglossary. (You filed your report using 5.8.7.)

Autovivification's generally useful as an aspect of Perl's "do what I  
mean" philosophy, but if you don't want Perl to work this way -- as  
you might not if used to Java, for example -- you'll have to write  
array-bound checks yourself: compare the proposed index against  
$#whatever -- the index of currently last element of the array --  
before using it.

For example,

$ perl -lwe '@a = ([1, 2], [3, 4, 5]); print $#a; for (0, 3) {exists  
$a[$_][0]}; print $#a'
$ perl -lwe '@a = ([1, 2], [3, 4, 5]); print $#a; for (0, 3) {exists  
$a[$_][0] unless $_ > $#a}; print $#a'

In the first case, the outer array got extended as the result of a  
test of whether an inner array element existed; in the second, the  
bounds check prevents this from happening.
Dominic Dunlop

Thread Previous Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About