有没有办法改变 Perl 中常量的值?

Anu*_*epa 5 perl

use constant TESTVERSION => 2;
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我想根据一些检查更改常量的值。如果条件为真,我应该使用相同的 TESTVERSION,如果为假,我必须使用一些不同的版本。perl 是否可以在运行时更新常量值?

ike*_*ami 6

不,必须在编译时(或至少在编译使用的代码之前)定义常量。但是没有什么可以阻止您在编译时进行检查。

use constant TESTVERSION => cond() ? 2 : 3;
Run Code Online (Sandbox Code Playgroud)

或者

sub test_version {
   return cond() ? 2 : 3;
}

use constant TESTVERSION => test_version();
Run Code Online (Sandbox Code Playgroud)

或者

my $test_version;
BEGIN {
   $test_version = cond() ? 2 : 3;
}

use constant TESTVERSION => $test_version;
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 6

常量表现为一个带有空原型的子,它总是返回相同的值,所以它可以被内联。用一个真正的子程序重新定义它。

use strict;
use warnings;
use feature 'say';

use constant TESTVERSION => 2;
my $TESTVERSION = TESTVERSION;
{   no warnings 'redefine';
    sub TESTVERSION() { $TESTVERSION }
}

for my $condition (0, 1) {
    $TESTVERSION = 3 if $condition;
    say TESTVERSION;
}
Run Code Online (Sandbox Code Playgroud)