Path: utzoo!utgpu!news-server.csri.toronto.edu!rutgers!usc!elroy.jpl.nasa.gov!jpl-devvax!lwall From: lwall@jpl-devvax.JPL.NASA.GOV (Larry Wall) Newsgroups: comp.lang.perl Subject: Re: Array wierdness Message-ID: <11308@jpl-devvax.JPL.NASA.GOV> Date: 5 Feb 91 17:19:44 GMT References: <1991Feb04.193857.21894@convex.com> Reply-To: lwall@jpl-devvax.JPL.NASA.GOV (Larry Wall) Distribution: usa Organization: Jet Propulsion Laboratory, Pasadena, CA Lines: 40 In article <1991Feb04.193857.21894@convex.com> sunshine@convex.com (Roger Sunshine) writes: : Given the simple script: : @array = (1,2,3,4,5,6,7); : : while(defined $array[0]) : { : print("Foo: $array[0]\n"); : shift(@array); : } : : printf("array len: %d, defined: %d\n", $#array, defined $array[0]); : : perl -v shows: : This is perl, version 3.0 : : $Header: perly.c,v 3.0.1.10 91/01/11 18:22:48 lwall Locked $ : Patch level: 44 : : Using ths perl, I get the following results when run: : Foo: 1 : Foo: 2 : Foo: 3 : Foo: 4 : Foo: 5 : Foo: 6 : Foo: 7 : array len: 0, defined: 0 : : Seems to me like $#array should be -1? : : This is cleared up by using "while(@array)". The problem is that the defined operator thinks it wants an lvalue, so it creates the array element in question while trying to decide if it's defined, much as saying "$array[0] = undef" would. It doesn't change the value of defined(), but it does modify the max array index. It may be fixable, but it's not way up there on my list. "while (@array)" is the recommended way to iterate an array to death. Larry