Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Delete idempotence

by derekstucki (Sexton)
on Feb 09, 2012 at 22:45 UTC ( [id://952869]=perlquestion: print w/replies, xml ) Need Help??

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

Is delete idempotent? ie, if I try to delete something that either never existed, or has already been deleted, does nothing bad happen?

Replies are listed 'Best First'.
Re: Delete idempotence
by ikegami (Patriarch) on Feb 09, 2012 at 23:05 UTC

    Is delete idempotent?

    Yes for hash elements. It does not even appear to reset the hash's iterator (which I find surprising).

    $ perl -E'%h=(a=>1,b=>1,c=>1); while (my ($k) = each(%h)) { say $k; }' c a b $ perl -E'%h=(a=>1,b=>1,c=>1); while (my ($k) = each(%h)) { say $k; de +lete $h{d}; }' c a b

    Yes for array elements. It doesn't extend the array up to the element to delete.

    $ perl -E'my @a = (4,5); say 0+@a; delete $a[10]; say 0+@a;' 2 2

    (Using delete on array element is documented as being deprecated.)

    if I try to delete something that either never existed

    Not a problem.

    $ perl -E'my %h; delete $h{x}; say "ok";' ok

    or has already been deleted

    Not a problem.

    $ perl -E'my %h = (x=>1); delete $h{x}; delete $h{x}; say "ok";' ok

      It does not even appear to reset the hash's iterator (which I find surprising).

      It's not documented in delete, but it is in each:

      If you add or delete a hash's elements while iterating over it, entries may be skipped or duplicated--so don't do that. Exception: It is always safe to delete the item most recently returned by each(), so the following code works properly:

      while (($key, $value) = each %hash) { print $key, "\n"; delete $hash{$key}; # This is safe }

      It probably wouldn't hurt if the POD for delete mentioned this as well.


      Dave

Re: Delete idempotence
by choroba (Cardinal) on Feb 09, 2012 at 22:57 UTC
    Be careful with autovivification:
    perl -e 'use Data::Dumper; $x = {a => "B"}; print Dumper $x; delete $x +->{y}{2}; print Dumper $x;' $VAR1 = { 'a' => 'B' }; $VAR1 = { 'y' => {}, 'a' => 'B' };

      ++

      That one has bit me a time or three.   It’s not wrong, per se, but maybe a bit unexpected.

Re: Delete idempotence
by kielstirling (Scribe) on Feb 09, 2012 at 22:53 UTC
    Delete is used to remove a element within a hash. Nothing bad will happen if you call delete on a undefined value.
Re: Delete idempotence
by ikegami (Patriarch) on Feb 09, 2012 at 22:52 UTC

    There is no "delete" op or function in Perl. Could you be more specific? I can think of a dozen things you could mean.

    uh, delete. Nevermind!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://952869]
Approved by ikegami
Front-paged by MidLifeXis
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2024-04-23 15:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found