在Perl中读取另一个包符号表

时间:2010-04-17 19:55:10

标签: perl typeglob

我正在尝试从另一个包中读取全局符号。我将包名称作为字符串。 我正在使用qualify_to_ref模块中的Symbol

    my $ref  = qualify_to_ref ( 'myarray', 'Mypackage' ) ;
    my @array =  @$ref ;

给了我Not an ARRAY reference at ......我认为我得到了解除引用的格式错误。

这是一个完整的示例程序。

    use strict;
    use Symbol ;

    package Mypackage ;
    our @myarray = qw/a b/ ;

    package main ;

    my $ref  = qualify_to_ref ( 'myarray', 'Mypackage' ) ;
    my @array =  @$ref ;

4 个答案:

答案 0 :(得分:4)

qualify_to_ref函数返回一个typeglob引用,您可以像这样取消引用:

my @array =  @{*$ref};

typeglob解除引用语法记录为here

答案 1 :(得分:4)

您也可以在不使用外部模块的情况下执行此操作,如“符号表”下perldoc perlmod中所述:

package Mypackage;
use strict;
use warnings;
our @myarray = qw/a b/;

package main;

our @array;
*array = \@Mypackage::myarray;
print "array from Mypackage is @array\n";

但是,这是否是一个好主意取决于您的程序的上下文。通常,最好使用访问器方法获取Mypackage的值,或者使用Exporter将变量导出到命名空间。

答案 2 :(得分:1)

除了FM已经注意到的方式之外,您还可以通过类似哈希的界面访问typeglob的特定部分:

my $array =  *{$ref}{ARRAY};

这可以方便地到达没有印记的部分,例如IO部分。我在Mastering Perl中有一章关于这类内容。

答案 3 :(得分:0)

你需要取消引用它:@ $$ ref而不是@ $ ref