Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于一些运行时计算值预先计算Perl常量_Perl_Constants - Fatal编程技术网

基于一些运行时计算值预先计算Perl常量

基于一些运行时计算值预先计算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',

这应该是相当琐碎的,但我自己无法解决。 有了下面的代码,有没有办法摆脱对dirnamerel2abs$0的多次调用

多谢各位

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",
};