I am trying to define constants in Perl using the 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 { ... }
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 $myHash{"" . FOO . ""}) {
I could add parentheses:
if (defined $myHash{FOO()}) {
Or, I could use a temporary variable:
my $foo = FOO;
if (defined $myHash{$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.