in reply to Delete idempotence

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

Replies are listed 'Best First'.
Re^2: Delete idempotence
by davido (Cardinal) on Feb 09, 2012 at 23:26 UTC

    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