in reply to use constant module

In the second case, print is being interpreted as a function, i.e. print(WEEKDAYS)[1];, where the [1] doesn't work. Normally this gets a warning, but you've run into a case where it doesn't:

$ perl -we 'print (3+4),5;' print (...) interpreted as function at -e line 1. Useless use of a constant (5) in void context at -e line 1. 7 $ perl -we 'print (WEEKDAYS)[1];' print (...) interpreted as function at -e line 1. syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors. $ perl -we 'print (WEEKDAYS)[1];' syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors.

Two workarounds in addition to your "case #1":

$ perl -we 'print +(3+4),5;' # disambiguate 75 $ perl -we 'print((3+4),5);' # explicit parens 75

Tip: B::Deparse comes in handy for debugging here:

$ perl -MO=Deparse,-p -e 'print (3+4),5;' (print(7), '???');

Replies are listed 'Best First'.
Re^2: use constant module (was moudle)
by kcott (Archbishop) on Feb 24, 2016 at 11:40 UTC
    "Normally this gets a warning, but you've run into a case where it doesn't"

    Update: You only get the warning if you ask for it and put exactly one space between the print and the left parenthesis. Using zero or more than one space, and no warning is emitted.

    $ perl -we 'use constant WD => qw{Sun Mon}; print(WD)[1]' syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors. $ perl -we 'use constant WD => qw{Sun Mon}; print (WD)[1]' print (...) interpreted as function at -e line 1. syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors. $ perl -we 'use constant WD => qw{Sun Mon}; print (WD)[1]' syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors. $ perl -we 'use constant WD => qw{Sun Mon}; print (WD)[1]' syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors.

    I tried up to five spaces: same result. Very weird!

    Original text:

    If you don't ask for warnings, you don't get warnings:

    $ perl -e 'use constant WD => qw{Sun Mon}; print (WD)[1]' syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors.

    If you ask for warnings, you get warnings:

    $ perl -we 'use constant WD => qw{Sun Mon}; print (WD)[1]' print (...) interpreted as function at -e line 1. syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors.

    There's nothing special something very strange about this case.

    — Ken

      Sorry but you're wrong, look closely:

      $ perl -we 'use constant WD => qw{Sun Mon}; print (WD)[1]' print (...) interpreted as function at -e line 1. syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors. $ perl -we 'use constant WD => qw{Sun Mon}; print (WD)[1]' syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors.

        That's very strange and unexpected behaviour. I've investigated this further and updated my post with the results.

        — Ken