如何将字符串变量中的值插入 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。
我正在用 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。