使用它访问Perl变量';s标量中的包名

使用它访问Perl变量';s标量中的包名,perl,Perl,在perl中,可以使用变量中的包名调用方法,如下所示: my $cls = 'PackageName'; $cls->method() 它调用PackageName->method() 使用包变量e的正确语法是什么。g$PackageName::某些_VAR以相同的方式,在$cls变量中包含包名?您需要使用以下语法 use strict; use warnings; use feature 'say'; package Foo; our $bar = 123; package mai

在perl中,可以使用变量中的包名调用方法,如下所示:

my $cls = 'PackageName';
$cls->method()
它调用
PackageName->method()


使用包变量e的正确语法是什么。g
$PackageName::某些_VAR
以相同的方式,在
$cls
变量中包含包名?

您需要使用以下语法

use strict;
use warnings;
use feature 'say';

package Foo;
our $bar = 123;

package main;
{
    my $package = 'Foo';
    no strict 'refs';
    say ${"${package}::bar"};
}
外部
${…}
仅供参考。语法表示将符号表中具有给定名称的值作为标量。内部
${package}
只是词法变量
$package
,带有花括号
{}
作为名称分隔符


关闭严格的引用以使其正常工作是很重要的。请记住在尽可能小的范围内执行此操作。

您需要使用以下语法

use strict;
use warnings;
use feature 'say';

package Foo;
our $bar = 123;

package main;
{
    my $package = 'Foo';
    no strict 'refs';
    say ${"${package}::bar"};
}
外部
${…}
仅供参考。语法表示将符号表中具有给定名称的值作为标量。内部
${package}
只是词法变量
$package
,带有花括号
{}
作为名称分隔符


关闭严格的引用以使其正常工作是很重要的。请记住在尽可能小的范围内执行此操作。

符号引用是唯一的方法吗?有没有比使用方法更好的方法?@vvch另一种方法是使用string
eval
。你当然不想那样做
my$val=eval“${package}::bar”
@simbabque您不想对受污染的变量执行string
eval
。否则,这没关系。符号引用是唯一的方法吗?有没有比使用方法更好的方法?@vvch另一种方法是使用string
eval
。你当然不想那样做
my$val=eval“${package}::bar”
@simbabque您不想对受污染的变量执行string
eval
。否则,这没关系。