如何在Perl中将变量用作模块名称?

mjn*_*n12 16 perl module

我知道可以在Perl中使用变量作为包变量的变量名.我想使用变量的内容作为模块名称.例如:

package Foo;
our @names =("blah1", "blah2");
1;
Run Code Online (Sandbox Code Playgroud)

在另一个文件中,我希望能够将标量的内容设置为"foo",然后Foo通过该标量访问names数组.

my $packageName = "Foo";
Run Code Online (Sandbox Code Playgroud)

基本上我想做的事情是:

@{$packageName}::names; #This obviously doesn't work.
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用

my $names = eval '$'. $packageName . "::names" 
Run Code Online (Sandbox Code Playgroud)

但只有当它Foo::names是一个标量.没有eval声明,有没有其他方法可以做到这一点?

fri*_*edo 16

要获取包中的包变量$package,可以使用符号引用:

no strict 'refs';
my $package = 'Foo';

# grab @Foo::names
my @names = @{ $package . '::names' }
Run Code Online (Sandbox Code Playgroud)

避免符号引用的更好方法是公开一个Foo返回数组的方法.这是有效的,因为方法调用operator(->)可以将字符串作为调用者.

package Foo;

our @names = ( ... );
sub get_names { 
    return @names;
}

package main;
use strict;

my $package = 'Foo';
my @names = $package->get_names;
Run Code Online (Sandbox Code Playgroud)

  • 你也可以一致地放弃parens.这是一致的.:) (4认同)

Eth*_*her 5

严格检查会阻止您使用变量(或文字字符串)作为名称的一部分,但这可以在本地禁用:

my @values;
{
    no strict 'refs';
    @values = @{"Mypackage"}::var;
}
Run Code Online (Sandbox Code Playgroud)