in reply to Why is this auto-quoted?

This is really only one case. In the example with the "fat comma" operator (=>), the fat comma isn't doing any quoting. The -foo gets is quoted anyway; without the fat comma...

my %hash = (-foo, 'bar');

The weird -foo thing is documented in perlop:

Unary "-" performs arithmetic negation if the operand is numeric. If the operand is an identifier, a string consisting of a minus sign concatenated with the identifier is returned. Otherwise, if the string starts with a plus or minus, a string starting with the opposite sign is returned. One effect of these rules is that -bareword is equivalent to the string "-bareword". If, however, the string begins with a non-alphabetic character (excluding "+" or "-"), Perl will attempt to convert the string to a numeric and the arithmetic negation is performed.

So it's a documented feature of Perl. Why was the feature added? I'm not quite sure of the history. It's possible that it was originally a mistake that arose in the code that parsed file test operators (see -X in perlfunc), and then became too widely used to change. Or maybe it was intentional to begin with.

Either way, it's quite a cute way to accept option names to functions, etc without needing to quote them.

package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name


Comment on Re: Why is this auto-quoted?
Select or Download Code
Re^2: Why is this auto-quoted?
by nbtrap (Sexton) on Jul 30, 2013 at 22:32 UTC
    That makes sense. The reason I missed it in the documentation was that I was looking at the documentation of => and not -.
Re^2: Why is this auto-quoted? (tcl/tk)
by Anonymous Monk on Jul 30, 2013 at 23:00 UTC

    Why was the feature added? I'm not quite sure of the history.

    Tcl/Tk likes it

    grid [ttk::button .b -text "Hello World"]
Re^2: Why is this auto-quoted?
by Anonymous Monk on Jul 31, 2013 at 03:27 UTC

    One effect of these rules is that -bareword is equivalent to the string "-bareword"
    Not really quit!. Check with B::Deparse, then you will discovery that -bareword is equalvalent to -'bareword' not '-bareword'

    perl -MO=Deparse -e' use warnings; use strict; my %ha = ( -foo => "bar"); print %ha; '
    gives
    use warnings; use strict; my %ha = (-'foo', 'bar'); print %ha; -e syntax OK
    Though with "-foo" there is no need of "=>".

      Not really quit!

      You know what the difference between -'foo' and '-foo' is? nothing

        You know what the difference between -'foo' and '-foo' is? nothing
        Interesting to note that -'foo' and -'+foo' deparse to the same thing, -'foo'. This could be a gotcha if you needed the + sign.

        -QM
        --
        Quantum Mechanics: The dreams stuff is made of