Readonly 有什么问题?
如果太慢,可以补充Readonly:XS。但如果你不喜欢Readonly,总会有旧的constant。
use constant PI => 3.14159265;
记住
- 它们像潜艇一样工作,因此它们不会在没有工作的情况下进行插值。
-
如果你想在一个语句中创建多个常量,你需要传递一个哈希引用。
use constant { PI => 3.14159265
, E => 2.71828183
};
从你的例子:
从你的例子来看,没有理由只读 hash 不能做同样的事情。
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};
如果不尝试让一门语言做它更支持以另一种方式做的事情,你可以获得很多经验。
与 PHP 同源constant
但是,如果您想这样做,那么我的建议是以下 sub 也是这样做的一种方式(并避免使用 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}_]/;