in reply to quoting style for lists

If I'm not completely misled: The => operator causes it's left operand to be seen as string as long as it only contains \w-characters and perhaps a leading -minus. The same rules afaik apply for $hash{keys}. In any other position you will get a bareword error from strict, which is in use anyway ;)

print Hello => ", $name\n"; %hair = ( Peter => 'green', Charles => white => ucfirst('mary') => 're +d' ); print "your hair is ",$hair{$name},"\n", "Peter's hair is ",$hair{Peter},"\n";
--
http://fruiture.de

Replies are listed 'Best First'.
Re: quoting style for lists
by Abigail-II (Bishop) on Aug 01, 2002 at 17:26 UTC
    The => operator causes it's left operand to be seen as string as long as it only contains \w-characters and perhaps a leading -minus. The same rules afaik apply for $hash{keys}. In any other position you will get a bareword error from strict, which is in use anyway ;)
    Well, it's a bit more complicated. Watch:
    #!/bin/sh for word in 'foo' '-foo' 'foo::bar' '-foo::bar' 'FOO' do code='$_ = '$word'; print' for args in ' ' '-w' '-Mstrict' '-Mstrict -w' do cmd="perl $args -le '$code'" echo $cmd eval $cmd echo done done
    Running this gives:
    perl -le '$_ = foo; print'
    foo
    
    perl -w -le '$_ = foo; print' 
    Unquoted string "foo" may clash with future reserved word at -e line 1.
    foo
             
    perl -Mstrict -le '$_ = foo; print'
    Bareword "foo" not allowed while "strict subs" in use at -e line 1.
    Execution of -e aborted due to compilation errors.
    
    perl -Mstrict -w -le '$_ = foo; print'
    Bareword "foo" not allowed while "strict subs" in use at -e line 1.
    Execution of -e aborted due to compilation errors.
     
    perl -le '$_ = -foo; print'
    -foo
     
    perl -w -le '$_ = -foo; print'
    -foo
     
    perl -Mstrict -le '$_ = -foo; print'
    -foo
    
    perl -Mstrict -w -le '$_ = -foo; print'
    -foo
             
    perl -le '$_ = foo::bar; print'
    foo::bar
    
    perl -w -le '$_ = foo::bar; print'
    foo::bar
    
    perl -Mstrict -le '$_ = foo::bar; print'
    Bareword "foo::bar" not allowed while "strict subs" in use at -e line 1.
    Execution of -e aborted due to compilation errors.
    
    perl -Mstrict -w -le '$_ = foo::bar; print'
    Bareword "foo::bar" not allowed while "strict subs" in use at -e line 1.
    Execution of -e aborted due to compilation errors.
     
    perl -le '$_ = -foo::bar; print'
    -foo::bar
    
    perl -w -le '$_ = -foo::bar; print'
    -foo::bar
             
    perl -Mstrict -le '$_ = -foo::bar; print'
    -foo::bar
    
    perl -Mstrict -w -le '$_ = -foo::bar; print'
    -foo::bar
    
    perl -le '$_ = FOO; print'
    FOO
    
    perl -w -le '$_ = FOO; print'
    FOO
    
    perl -Mstrict -le '$_ = FOO; print'
    Bareword "FOO" not allowed while "strict subs" in use at -e line 1.
    Execution of -e aborted due to compilation errors.
    
    perl -Mstrict -w -le '$_ = FOO; print'
    Bareword "FOO" not allowed while "strict subs" in use at -e line 1.
    Execution of -e aborted due to compilation errors.
             
    
    Interesting, isn't? (And yes, there are good reasons why Perl behaves this way - I won't tell you know, think about it for a while)

    Abigail

      I see, what use should any unary '-' with bareword have apart from being a shell-option-like string? Thanks.
      But even the use of -barewords at other positions than before => and inside $hash{keys} is hairy anyway:

      use strict; use warnings; sub foo(){ 'x' } $_ = -foo; # Ambiguous use of -foo # resolved as -&foo() at ./ol line 8. print; # '-x' sub bar() { -1 } $_ = -bar; #Ambigous ... as -&bar() ... print; # 1 !not "--1" my %h = ( -foo => 'FOO' ); print keys %h,' : ',$h{-foo}; # '-foo : FOO'

      So to be on the safe side one should quote at these points, because if there is a reserved word 'foo' in the future, you will have a problem writing -foo barely.

      --
      http://fruiture.de
        sub bar() { -1 } $_ = -bar; #Ambigous ... as -&bar() ... print; # 1 !not "--1"
        Documented! From man perlop:
               Unary "-" performs arithmetic negation if the operand is
               numeric.  If the operand is an identifier, a string con-
               sisting 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 "-bareword".
        
        For fun, let "bar" return qq {-1}, and see one of the places in Perl were it matters whether a value is a string or a number.

        Abigail