基于一些运行时计算值预先计算Perl常量
这应该是相当琐碎的,但我自己无法解决。 有了下面的代码,有没有办法摆脱对dirnamerel2abs$0的多次调用 多谢各位基于一些运行时计算值预先计算Perl常量,perl,constants,Perl,Constants,这应该是相当琐碎的,但我自己无法解决。 有了下面的代码,有没有办法摆脱对dirnamerel2abs$0的多次调用 多谢各位 my $dirname; BEGIN { $dirname = dirname(rel2abs($0)); } use constant BAR_NAMES => { WATER => $dirname . '/../data/water.png', FIRE => $dirname .'/../data/fire.png',
my $dirname;
BEGIN { $dirname = dirname(rel2abs($0)); }
use constant BAR_NAMES => {
WATER => $dirname . '/../data/water.png',
FIRE => $dirname .'/../data/fire.png',
GRASS => $dirname .'/../data/grass.png'#,
#and so on
};
您需要BEGIN块,因为use语句中的任何表达式都是在编译时求值的 您可以在地图中滚动它:
除了现有的优秀答案外,还有
use constant PROJ_ROOT => dirname(rel2abs($0)) . '/..';
use constant BAR_NAMES => {
WATER => PROJ_ROOT.'/data/water.png',
FIRE => PROJ_ROOT.'/data/fire.png',
GRASS => PROJ_ROOT.'/data/grass.png',
};
及
uc$uu也可以写为+uctanks,但在这种情况下,它将被计算多次。但我想避免这种情况。@varnie:如果你在余生中每天运行一百次,那么加起来可能足够长的时间让人注意到。@ysth:底层文件系统是Andrew file system还是curlftpfs,这可能很重要。。。
use constant BAR_NAMES =>
{
map { uc( $_ ) => dirname(rel2abs($0)) . "/../data/$_.png" }
qw< water fire grass >
};
use constant BAR_NAMES =>
{
map { uc( $_ ) => rel2abs("$0/../data/$_.png") }
qw< water fire grass >
};
use constant BAR_NAMES => do {
my $dirname = dirname(rel2abs($0));
{
WATER => $dirname . '/../data/water.png',
FIRE => $dirname .'/../data/fire.png',
GRASS => $dirname .'/../data/grass.png'#,
#and so on
}
};
use constant PROJ_ROOT => dirname(rel2abs($0)) . '/..';
use constant BAR_NAMES => {
WATER => PROJ_ROOT.'/data/water.png',
FIRE => PROJ_ROOT.'/data/fire.png',
GRASS => PROJ_ROOT.'/data/grass.png',
};
use FindBin qw( $RealBin );
use constant BAR_NAMES => {
WATER => "$RealBin/../data/water.png",
FIRE => "$RealBin/../data/fire.png",
GRASS => "$RealBin/../data/grass.png",
};