DVK*_*DVK 4 perl constants symbol-table
我有一组在Perl中声明的常量:
use constant C1 => 111;
use constant C2 => 222;
..
use constant C9 => 999;
my $which_constant = "C2";
Run Code Online (Sandbox Code Playgroud)
我如何构造一个Perl表达式,该表达式基于$which_constant派生用该变量的值命名的常量的值 - 例如"222".
请注意,我无法更改上述任何条件 - 它们是真实场景的简化:我有一个模块(我无法控制)从中导入这些常量.其中一个常量的名称由用户从命令行提供.我需要访问适当的常量值.
我一直在靠墙撞击(主要围绕各种怪异的glob构造),但它们都不起作用.
PS如果解决方案访问其原生模块中的常量 - 比如说My::Constants::C2(无需导入它们),甚至更好,但不是必需的 - 我可以main::轻松导入正确的常量My::Constants->import($which_constant).是的,最重要的是,默认情况下不会导出te常量,因此需要显式的import()调用.
我试过的一些事情:
main::$which_constant - 语法错误
main::${which_constant} - 语法错误
${*$which_constant} - 返回空值
*$which_constant - 返回"*main :: C2"
${*${*which_constant}} - 空
Sin*_*nür 13
定义的常量constant.pm只是子程序.如果在字符串中包含常量的名称,则可以使用方法调用语法:
#!/usr/bin/perl -l
use strict; use warnings;
use constant C1 => 111;
use constant C2 => 222;
print __PACKAGE__->$_ for qw( C1 C2 );
# or print main->$_ for qw( C1 C2 );
Run Code Online (Sandbox Code Playgroud)
这样,如果您尝试使用未定义的常量,则会出现错误.
Perl"常量"实际上是返回常量值的子例程.perl编译器能够在编译时用适当的值替换它们.但是,由于您希望基于运行时名称查找获取值,因此您应该:
&{$which_constant}();
Run Code Online (Sandbox Code Playgroud)
(当然,你需要no strict 'refs'某个地方.)