in reply to All uppercase subs

Death to use constant! I've never seen the appeal of use constant, and with modern Perls, it's completely unnecessary.

You can't easily interpolate 'constants' as they lack the sigil, and because of that, they also get auto-quoted on the left of a fat arrow, or if it's the only thing in a hash index. Furthermore, if you see:

my $variable = ALL_CAPS + 1;
does that mean that $variable becomes one more than the constant ALL_CAPS, or does $variable get the result of ALL_CAPS(1)?

Luckely, there's Readonly.pm:

use Readonly; Readonly my $PI => 4 * atan2(1, 1); Readonly my $DEBUG => 0;
Much better, IMO.

Replies are listed 'Best First'.
Re^2: All uppercase subs
by bart (Canon) on Jul 17, 2005 at 11:59 UTC
    Constants have the advantage of getting optimized away, when used as booleans in conditionals. Like this:
    use constant DEBUG => 0; if(DEBUG) { print "This will be gone.\n"; } else { print "Hello, world!\n"; }
    Using perl -w -MO=Deparse test.pl, the outcome is:
    BEGIN { $^W = 1; } use constant ('DEBUG', 0); do { print "Hello, world!\n" }; test.pl syntax OK
    with the equivalent code using Readonly,
    use Readonly; Readonly $DEBUG => 0; if($DEBUG) { print "This will be gone.\n"; } else { print "Hello, world!\n"; }
    I get this instead:
    BEGIN { $^W = 1; } use Readonly; Readonly $DEBUG, 0; if ($DEBUG) { print "This will be gone.\n"; } else { print "Hello, world!\n"; } test.pl syntax OK
Re^2: All uppercase subs
by blazar (Canon) on Jul 18, 2005 at 13:56 UTC
    Death to use constant! I've never seen the appeal of use constant, and with modern Perls, it's completely unnecessary.
    I must say that you have strong arguments. Though I feel that constant.pm has some appeal. Besides, being "constants" really subs with an empty prototype and being subs with an empty prototype optimized away, they're really close to being real constants. Some times I roll my own pseudo-constants (when I need them to be closures), e.g.:
    use File::Basename; { my $name=basename $0; sub USAGE () { "Usage: $name [options] <args>\n" } } die USAGE unless @ARGV;
    You can't easily interpolate 'constants' as they lack the sigil, and because of that, they also get auto-quoted on the left of a fat arrow, or if it's the only thing in a hash index.
    Excellent points! Especially the latter. As far as the first goes, I occasionally use constant.pm's constants, but I hardly ever felt the need to interpolate any.
    Furthermore, if you see:
    my $variable = ALL_CAPS + 1;
    does that mean that $variable becomes one more than the constant ALL_CAPS, or does $variable get the result of ALL_CAPS(1)?
    Here I disagree. It is obvious that it is "one more than the constant ALL_CAPS", for the same reason as above about empty prototypes.
    Luckely, there's Readonly.pm:
    use Readonly; Readonly my $PI => 4 * atan2(1, 1); Readonly my $DEBUG => 0;
    Much better, IMO.
    I don't happen to use it. But indeed it's a good module, I suspect that it may introduce some overhead and maybe for "DEBUG"-like stuff constant.pm may be preferable.