Я пытаюсь определить константы в Perl с помощью constant
прагмы:
use constant {
FOO => "bar",
BAR => "foo"
};
У меня возникают проблемы, и я надеюсь, что там будет стандартный способ обработки.
Прежде всего...
Я определяю крючок script для Subversion. Чтобы сделать все просто, я хочу иметь один файл, в котором я использую класс (пакет), в том же файле, что и мой фактический script.
Большая часть этого пакета будет содержать константы:
print "This is my program";
package MyClass;
use constant {
FOO => "bar"
};
sub new { ... }
Я хочу, чтобы моя константа FOO
была доступна моей основной программе. Я хотел бы сделать это, не обращаясь к нему как MyClass::FOO
. Обычно, когда пакет представляет собой отдельный файл, я мог бы сделать это в своей основной программе:
use MyClass qw(FOO);
но поскольку мой класс и программа являются одним файлом, я не могу этого сделать. Что было бы лучшим способом для моей основной программы иметь доступ к моим константам, определенным в моем классе?
Вторая проблема...
Я хотел бы использовать константные значения в качестве хеш-ключей:
$myHash{FOO} = "bar";
Проблема заключается в том, что %myHash
имеет буквальную строку FOO
как ключ, а не значение константы. Это вызывает проблемы, когда я делаю такие вещи:
if (defined $myHash{FOO}) {
print "Key " . FOO . " does exist!\n";
}
Я могу заставить контекст:
if (defined $myHash{"" . FOO . ""}) {
Я мог бы добавить круглые скобки:
if (defined $myHash{FOO()}) {
Или, я мог бы использовать временную переменную:
my $foo = FOO;
if (defined $myHash{$foo}) {
Ни один из них не является действительно хорошим способом решения этой проблемы. Итак, что является лучшим способом? Есть один способ, которым я не хватает?
Кстати, я не хочу использовать Readonly::Scalar
, потому что это 1). медленно, и 2). не входит в стандартный пакет Perl. Я хочу определить, что мой крючок не требует дополнительных пакетов Perl и как можно проще работать.