Using Constants in Perl
- by David W.
I am trying to define constants in Perl using the use Constant pragma:
use Constant {
FOO => "bar",
BAR => "foo"
};
I'm running into a bit of trouble, and hoping there's a standard way of handling it.
First of all...
I am defining a hook script for Subversion. To make things simple, I want to have a single file where the class (package) I'm using is in the same file as my actual script.
Most of this package will have constants involved in it:
print "This is my program";
package "MyClass";
use constant {
FOO => "bar"
};
sub new {
yaddah, yaddah, yaddah.
I would like my constant FOO to be accessible to my main program. I would like to do this without having to refer to it as MyClass::FOO. Normally, when the package is a separate file, I could do this in my main program:
use MyClass qw(FOO);
but, since my class and program are a single file, I can't do that. What would be the best way for my main program to be able to access my constants defined in my class?
The second issue...
I would like to use the constant values as hash keys:
$myHash{FOO} = "bar";
The problem is that %myHash has the literal string FOO as the key and not the value of the constant. This causes problems when I do things like this:
if (defined($myHash{FOO})) {
print "Key " . FOO . " does exist!\n";
}
I could force the context:
if (defined("" . FOO . "")) {
I could add parentheses:
if (defined(FOO())) {
Or, I could use a temporary variable:
my $foo = FOO;
if (defined($foo)) {
None of these are really nice ways of handling this issue. So, what is the best way? Is there one way I'm missing?
By the way, I don't want to use Readonly::Scalar because it is 1). slow, and 2). not part of the standard Perl package. I want to define my hook not to require additional Perl packages and to be as simple as possible to work.