String 如何在perl中将一行中的哈希引用转换为常量

String 如何在perl中将一行中的哈希引用转换为常量,string,perl,casting,constants,String,Perl,Casting,Constants,我正在使用 对于这个代码示例,是否有更简单的方法将字符串转换为常量 use Sphinx::Search; my $config = { x => 'SPH_MATCH_EXTENDED2', }; my $x = $config->{x}; print Sphinx::Search->$x(); # output: 6 我已经采纳了他的建议 这个例子是可行的,但如果我总是使用散列中的字符串,那么我是否需要将它放入一个单独的变量中以这种方式使用它 my $x =

我正在使用

对于这个代码示例,是否有更简单的方法将字符串转换为常量

use Sphinx::Search;

my $config = {
    x => 'SPH_MATCH_EXTENDED2',
};

my $x = $config->{x};
print Sphinx::Search->$x(); # output: 6
我已经采纳了他的建议 这个例子是可行的,但如果我总是使用散列中的字符串,那么我是否需要将它放入一个单独的变量中以这种方式使用它

my $x = $config->{x};
print Sphinx::Search->$x(); # output: 6
这个有单程票吗

# does not work
print Sphinx::Search->$config->{x}();

您可以创建对该值的引用并立即取消引用:

Sphinx::Search->${ \$config->{x} };

(如果没有参数,
()
是可选的)。

我猜
SPH\u MATCH\u EXTENDED2
是由
Sphinx::Search
导出的常量的名称。问题在于,这些函数是作为一个没有参数的子例程实现的,因此您只能在一个简单的子例程名称被Perl理解为调用的情况下,或者在显式调用有效的情况下使用它们(
SPH\u MATCH\u EXTENDED2()

最简单的解决方案是完全避免引用散列值,就像这样

my $config = { x => SPH_MATCH_EXTENDED2 }
之后,您可以使用

$config->{x};    # 6

与调用伪类方法不同

执行长版本通常更容易理解,只要使用正确的描述性变量名即可<代码>我的$method=$config->{x};打印Foo->$method()完全可以接受。代码越短越好。记住,代码中最昂贵的部分既不是编写也不是运行,而是其他开发人员花在阅读和理解所发生的事情上的时间。这些不是常数
$x
仍然是一个变量。语法分析器不允许在
->
之后有任何表达式。它必须是原子的。如果您想要一个实际的常量,您必须在运行时使用原型创建一个新的命名子对象,可能需要使用内联字符串
eval