in reply to Re^2: Why doesn't exist work with hash slices?
in thread Why doesn't exist work with hash slices?

According to perldoc -f delete, it returns the deleted value, not a Boolean. And,

$ perl -E 'my %foo = qw{ bar 42 }; say delete $foo{bar};'

in fact prints 42.

Replies are listed 'Best First'.
Re^4: Why doesn't exist work with hash slices?
by ikegami (Patriarch) on Sep 21, 2025 at 16:16 UTC

    LanX isn't saying that delete ELEMENT returns a boolean; they're saying that since delete SLICE returns a list of what it would return for a single element (the deleted element), exists SLICE should also return a list of what it return for a single element (a boolean).

Re^4: Why doesn't exist work with hash slices?
by LanX (Saint) on Sep 21, 2025 at 14:02 UTC
    Delete returns the deleted value*s* (plural) of a slice and you didn't test a slice. ¹

    Exists returns an (informal) Boolean (1 or dualvar ""/0) for a hash entry, and logically should also return a list of booleans in case of a slice.

    Cheers Rolf

    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

    Edit

    ¹) From the docs of delete I already linked to

    my %hash = (foo => 11, bar => 22, baz => 33); my $scalar = delete $hash{foo}; # $scalar is 11 $scalar = delete @hash{qw(foo bar)}; # $scalar is 22 my @array = delete @hash{qw(foo baz)}; # @array is (undef,33) <--- H +ERE
      And if given a key value slice, delete returns a list of key value pairs of what was deleted from the hash. Not clear what a corresponding exists feature would do.
        > delete returns a list of key value pairs of what was deleted

        Yes and no.

        delete returns also key value pairs that are in the slice but didn't exist before, now with an undef value.

        DB<1> @h{a..c}=1..3 DB<2> x delete %h{c,d} 0 'c' 1 3 2 'd' 3 undef DB<4> x delete @h{a,d} 0 1 1 undef DB<5>

        This means you can't use delete to calculate the intersection of two sets of keys. (Well you can, but only with detours).

        This is a missed opportunity with delete %h{LIST} we could have implemented sets via hashes.

        > Not clear what a corresponding exists feature would do

        Probably exactly the same thing like with a classic slice.

        But exists SLICE in scalar context could return the number of existing elements. This could be equally used to calculate any or all .

        Well this kind of would break the symmetry to delete SLICE with only returns the last element in the list. But this is a pretty useless feature anyway IMHO

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        see Wikisyntax for the Monastery