perlfan99 has asked for the wisdom of the Perl Monks concerning the following question:

i've seen some perl code, and don't understand why parentheses are used for a constant value, it likes a method call to me. Thanks ------------------ use constant BUFFER => 20; ... if ( BUFFER() != 20) ...

Replies are listed 'Best First'.
Re: use constant with parentheses
by ikegami (Patriarch) on Jun 24, 2008 at 05:10 UTC

    Constants created by use constant are actually functions, or at least act like them.

    The parens aren't needed in the code you gave, but they don't harm anything either.

    >perl -MO=Concise -e"use constant BUFFER => 20; if (BUFFER() != 20) {} +" 3 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 72 -e:1) v ->3 - <0> ex-const v/4 ->3 -e syntax OK >perl -MO=Concise -e"use constant BUFFER => 20; if (BUFFER != 20) {}" 3 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 72 -e:1) v ->3 - <0> ex-const v/4 ->3 -e syntax OK

    They do help in other circumstances, though. If a bareword is expected, then the constant will be treated as a bareword instead of as a constant. EXPR => might be the only problem.

    >perl -le"use constant FOO => 'abc'; print %{{ FOO => 'def' }};" FOOdef >perl -le"use constant FOO => 'abc'; print %{{ FOO() => 'def' }};" abcdef

    Update: Interestingly, neither $hash{EXPR} and sub(*)->{EXPR} treat the constant as a bareword. EXPR => might be the only case where it's an issue.

      Ah, but try this with The Real Comma ...

      perl -l -e 'use constant FOO => "abc"; print %{{ FOO , "def" }}'

      I happened on it earlier at work where everything was as expected -- in hash (reference) assignment -- when constants were used with "," but displayed ugly head when used with "=>". (Yes, calling the constant "variable" as a sub that it really is worked around the problem.)

      I had managed to put up with constants not properly interpolating in strings. Not any more.

        Normal comma doesn't expect a bareword, thus no problem.

Re: use constant with parentheses
by CountZero (Bishop) on Jun 24, 2008 at 05:42 UTC
    You are right and if you like your constants to behave more like real variables, check-out the Readonly module. Conway suggests to use Readonly rather than use constant as one of his "Best Practices".

    CountZero

    A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James