如何将字符串变量中的值插入 Perl 中的常量?

How do I interpolate the value in a string variable into a constant in Perl?

我正在用 Perl 编写一个函数,其中将字符串作为参数传递,我需要将字符串解释为引用值。该字符串看起来像这样: "Edible => 1;Fruit => STRAWBERRY;" 现在,变量部分将使用散列存储,但是,该值已经使用常量定义。我的问题是,一旦将值存储到临时变量中,如何将其转换为常量值? 这是一些示例代码:

#!/usr/bin/perl

require Exporter;

our @ISA = 'Exporter';
our @EXPORT = qw(STRAWBERRY TANGERINE PEAR APPLE PERSIMMON FUNC_Interpreter);

use constant {
    STRAWBERRY => 1
   ,TANGERINE => 2
   ,PEAR => 3
   ,APPLE => 4
   ,PERSIMMON => 5
};

sub FUNC_Interpreter {
    my ($analyze_this) = @_;
    my @values;
    foreach my $str (split (/;/, $analyze_this)) {
        my ($key, $value) = split /=>/, $str;
        push (@values, @{[ $value ]});           # Problem line! I want to store the numeric value here. This doesn't work... :(
    }
}

FUNC_Interpreter ("HELLO=>TANGERINE;HELLO=>STRAWBERRY");

基本上,我想做的是将字符串(实际上是存储在变量中的常量名称)转换为常量值。这可能吗?

常量可以被视为子项。

{
   no strict qw( refs );
   push @values, $value->();
}

push @values, ( \&$value )->();

但这是一种骇人听闻的冒险方法。而第二个版本甚至隐藏了您允许用户调用任何包中的任何 sub 的危险。我会怎么做:

my %lookup;
BEGIN {
   %lookup = (
      STRAWBERRY => 1,
      TANGERINE  => 2,
      PEAR       => 3,
      APPLE      => 4,
      PERSIMMON  => 5,
   );
}

use constant \%lookup;
push @values, $lookup{ $value };

使用这种方法,可以简单地验证输入,无效输入只会导致 undef。