Dear monks,
Just a short meditation to alert you to the evils that lurk in POSIX constants. For example
% perl -MPOSIX=CHAR_MAX -wle 'print( CHAR_MAX )'
127
% perl -MPOSIX=CHAR_MAX -wle 'print( CHAR_MAX + 1 )'
127
No difference between printing
CHAR_MAX and
CHAR_MAX + 1! A quick consultation with
MO=Deparse provides the necessary insight:
% perl -MPOSIX=CHAR_MAX -MO=Deparse,-p -e 'print( CHAR_MAX + 1 )'
print(CHAR_MAX(1));
-e syntax OK
But check this out:
% perl -Mconstant=CHAR_MAX,127 -wle 'print( CHAR_MAX + 1 )'
128
% perl -Mconstant=CHAR_MAX,127 -wle 'print( CHAR_MAX( 1 ) )'
Too many arguments for main::CHAR_MAX at -e line 1, at end of line
Execution of -e aborted due to compilation errors.
It appears that rolling one's own
CHAR_MAX with
constant produces a more civilized item than
POSIX::CHAR_MAX.
I haven't delved into the POSIX module to get to the bottom of this but we can conclude that, although POSIX constants are subs, they don't behave as nicely as those produced with the constant pragma. They can bite, so watch out.
Thanks to tye for the words o' wisdom.