http://qs321.pair.com?node_id=144319


in reply to Clearing Array Values

The typical methods for clearing an array are @array = () or undef @array. (These are slightly different in effect; undef will clear (almost) all memory associated with the array but the other method will leave some of it around anticipating that the array is likely to again grow to similar size.)

$#array = -1 can also be used for clearing an array, but I'd consider it unnecessairly confusing.

update: As you noticed $#array=() is equivilent to $#array=0 (since () is a zero-element list update (2): Oops, see anonymous monk's correction below. Note that $#array = () even gives the warning "Use of uninitialized value in scalar assignment" assuming warnings are on.) which makes 0 the last index in @array. This, obviously, does not actually clear the whole array.

Also, note that @array[0] should generally not be used; $array[0] is probably what you want. (Same, of course, goes for @array[1], etc.) There is a subtle difference between the two which may bug you in the future.

Replies are listed 'Best First'.
Re: Re: Clearing Array Values
by Anonymous Monk on Feb 09, 2002 at 06:22 UTC
    Yeah, knew that on the @ and $ thing there, used the @ so the writing was clearer.. I tested out your two thing and came up with a parallel <sp? its late> problem.

    $array =(); print $#array, "\n"; results in -1 as it should be since the array has no values any longer and is a cleared array.

    $array = undef; print $#array, "\n"; results in 0; which is not a cleared array, its an array with one value, and in this programs case would have resulted in the same bug, since the looping would have then started at the $array1 value instead of $array[0] value.

    Ah. the things I think are important on a Friday night.

    Anyway, thanks for the comments, always more than one way to do a thing.

    webadept
      undef @array and @array = undef are not the same thing.
      Yeah, knew that on the @ and $ thing there, used the @ so the writing was clearer.. I tested out your two thing and came up with a parallel problem.

      so, who doesn't use warnings then? :)

      rdfield

      You seem to be confused. I did not mean that $array should be used instead of @array. @array is definately correct if you are not selecting an indiviual element...
Re: Re: Clearing Array Values
by Anonymous Monk on Feb 10, 2002 at 03:53 UTC
    $#array=() is equivilent to $#array=0 (since () is a zero-element list)

    If you mean that () returns 0 in scalar context because the parentheses are empty you're way off. In the expression $#array = () there is no list. The parentheses are used for precedence only! There's no such thing as a list is scalar context -- or at least not that I know of. Since there's nothing inside the parentheses the undefined value will be returned.

    -Anomo