Ne Readonly
a> nesi var?
Çok yavaş ise, Readonly:XS
. But if you don't like Readonly
, there's always the older constant
a> ile tamamlayabilir.
use constant PI => 3.14159265;
Sadece hatırlıyorum
- Onlar subs gibi çalışır, bu yüzden iş olmadan sokmak yok.
Tek bir deyimde birden sabitler oluşturmak istiyorsanız, bir karma başvuru geçmesi gerekir.
use constant { PI => 3.14159265
, E => 2.71828183
};
From Your Example:
Sizin örnekte bakılırsa, bir salt okunur hash aynı şeyi yapamadık hiçbir neden yok.
Readonly::Hash my %field_example => { L => 25, O => 345 };
Sonra sabit Arnavut kaldırımı isterdim hiçbir yerde kullanabilirsiniz:
print "The example is $field_example{$var}\n";
Ya da bunu bu şekilde yapabiliriz:
Readonly::Hash my %field
=> { example => { L => 25, O => 345 }
, name => { L => 'Lion', O => 'ocelot' }
};
Ve bu şekilde arayın:
$field{$var}{L};
Eğer bir dil, başka bir şekilde yapmak için daha iyi bir destek var ne yapmak çalışmıyorum yaklaşık kilometre bir sürü alabilirsiniz.
Cognate to PHP constant
Eğer bu şekilde yapmak istiyorsanız Ancak, o zaman benim önerim aşağıdaki alt aynı yapmanın bir yoludur (ve kaçınan bir eval
) olduğunu:
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->();
}
Böyle derim:
$value = read_constant( 'FIELD_', $var, 'L' );
Son bir şey, hatta sadece bir bütün kap dize olduğundan emin olmak için önünde bir testi koymak olmasıdır:
Carp::croak "Invalid constant name '$name'" if $name =~ /[^\p{UpperCase}_]/;