Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Clearing Array Values

by webadept (Pilgrim)
on Feb 09, 2002 at 05:03 UTC ( #144318=perlquestion: print w/replies, xml ) Need Help??

webadept has asked for the wisdom of the Perl Monks concerning the following question:

I recently wrote program that reused an array variable several times. Normally I clear the values of any array by : $#myarray=(); and have never had a problem with this, of course I never really needed to make sure that the @myarray[0] cell was free. This program developed a bug because the [0] vaule continued to hold on even though I reset the variable with the above method.

To solve this I used $#array= -1; and that solved the problem with no more bugs. I needed asprin from pounding my head on the desk, but the program worked and that's what's important.

I've checked many sources and all of them give my first method as the proper means of clearing an array of all values. I'm just wondering if anyone else has had issues with this, or hopfully to save someone else the headache of my little discovery

webadept

Edit by tye

Replies are listed 'Best First'.
Re: Clearing Array Values
by wog (Curate) on Feb 09, 2002 at 05:10 UTC
    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.

      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...
      $#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
Re: Clearing Array Values
by screamingeagle (Curate) on Feb 09, 2002 at 05:11 UTC
    well, in my opinion, one would be better off using :
    @myarray = ();
    When you use
    $#myarray = ()
    you are referring to the number of elements in the array, not the array itself, since $#myarray gets the number of array elements present
Re: Clearing Array Values
by Parham (Friar) on Feb 09, 2002 at 13:38 UTC
    this is a very iffy subject i couldn't find clear documentation on with examples. from the documentation i've read on undef(), doing this:
    UPDATE on the following code
    undef @array; #@array undefined undef $scalar; #$scalar will be undefined
    will clear those datatypes.. whereas
    @array[2] = undef; #pick element number to undefine $scalar = undef; #$scalar will exist, but with no value
    would assign undefined values to the datatypes. The biggest use for this would be assigning $variables to some array elements.. ie:
    ($value1,undef,undef,$value2,$value3,undef) = @array;
    (thank you crazyinsomniac)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://144318]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (2)
As of 2021-03-03 02:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favorite kind of desktop background is:











    Results (69 votes). Check out past polls.

    Notices?