如何在Perl中访问名称包含在变量中的常量?

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)

这样,如果您尝试使用未定义的常量,则会出现错误.

  • 在这种情况下,你可以说'My :: Constants - > $ which_constant`并完全跳过`import`步骤.为了更好地进行错误检查,你还可以检查`My :: Constants-> can($ which_constant)`如果你想确保常量存在(虽然这不会区分常量和其他潜艇. (2认同)

JSB*_*ոգչ 8

Perl"常量"实际上是返回常量值的子例程.perl编译器能够在编译时用适当的值替换它们.但是,由于您希望基于运行时名称查找获取值,因此您应该:

&{$which_constant}();
Run Code Online (Sandbox Code Playgroud)

(当然,你需要no strict 'refs'某个地方.)

  • 或者`$ which_constant - >()`或者只是`&$ which_constant` (5认同)