3

我正在尝试从另一个包中读取全局符号。我将包名称作为字符串。我正在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

4 回答 4

4

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

my @array =  @{*$ref};

此处记录了 typeglob 取消引用语法。

于 2010-04-17T20:04:31.220 回答
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将变量导出到您的命名空间。

于 2010-04-17T20:35:58.403 回答
1

除了 FM 已经提到的方式之外,您还可以通过它的类似哈希的接口访问 typeglob 的特定部分:

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

IO这可以很方便地找到没有印记的部分,例如部分。我在Mastering Perl中有一个关于这类东西的章节。

于 2010-04-20T17:56:30.933 回答
0

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

于 2010-04-17T20:14:15.180 回答