Что не так с Readonly
?
Если он слишком медленный, вы можете дополнить его Readonly:XS
.Но если вам не нравится Readonly
, всегда есть старшее constant
.
use constant PI => 3.14159265;
Просто запомните
- Они работают как сабвуферы, поэтому не работают без работы.
Если вы хотите создать несколько константв одном операторе вам нужно передать ссылку на хеш.
use constant { PI => 3.14159265
, E => 2.71828183
};
Из вашего примера:
Судя по вашему примеру, нет никаких причин, по которым хэш 10 * * readonly не может сделать то же самое.
Readonly::Hash my %field_example => { L => 25, O => 345 };
Тогда вы можете использовать его в любом месте, где захотите мощь константы:
print "The example is $field_example{$var}\n";
ИЛИ вы можете сделать это так:
Readonly::Hash my %field
=> { example => { L => 25, O => 345 }
, name => { L => 'Lion', O => 'ocelot' }
};
И назовите это так:
$field{$var}{L};
Вы можете получить много пользы от попыток заставить язык делать то, что он лучше поддерживает, чем-то другим.
Cognate to PHP constant
Однако, если вы хотите сделать это таким образом, то я предлагаю, чтобы следующий подпрограмма была способом сделать то же самое (и избегать eval
):
sub read_constant {
use Symbol qw<qualify_to_ref>;
my $name = join( '', @_ ); # no need to concatenate before passing
my $constant;
# use the first that works: calling package and then "" (main)
for my $pkg ( scalar( caller ), "" ) {
# get symbol reference
my $symb_ref = qualify_to_ref( $name, $pkg );
# get the code slot
$constant = *{$symb_ref}{CODE};
last if $constant;
}
return unless $constant;
# call the sub named
return $constant->();
}
Вы бы назвали это так:
$value = read_constant( 'FIELD_', $var, 'L' );
И последнее: вы можете даже поставить тест перед собой, чтобы убедиться, что он толькострока со всеми заглавными буквами:
Carp::croak "Invalid constant name '$name'" if $name =~ /[^\p{UpperCase}_]/;