Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中读取另一个包符号表_Perl_Typeglob - Fatal编程技术网

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

在Perl中读取另一个包符号表,perl,typeglob,Perl,Typeglob,我试图从另一个包中读取全局符号。我将包名作为字符串。 我正在使用qualify\u to\u reffromSymbol模块 my $ref = qualify_to_ref ( 'myarray', 'Mypackage' ) ; my @array = @$ref ; 在……处给我而不是数组引用我想我得到的解引用格式是错误的 下面是一个完整的示例程序 use strict; use Symbol ; package Mypackage ;

我试图从另一个包中读取全局符号。我将包名作为字符串。 我正在使用
qualify\u to\u ref
from
Symbol
模块

    my $ref  = qualify_to_ref ( 'myarray', 'Mypackage' ) ;
    my @array =  @$ref ;
在……处给我
而不是数组引用
我想我得到的解引用格式是错误的

下面是一个完整的示例程序

    use strict;
    use Symbol ;

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

    package main ;

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

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

my @array =  @{*$ref};

typeglob取消引用语法已记录在案。

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

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


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

除了FM已经指出的方式之外,您还可以通过类似散列的接口访问typeglob的特定部分:

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

这可以方便地访问没有信号的部分,例如
IO
部分。我在中有一章是关于这类东西的。

你能修改一下这个问题吗?“包名在一个字符串中”是对前面评论的重新表述-如果另一个包是事先知道的,这种方式看起来很好,但是如果包名是在运行时指定的,我看不到如何使用它。为什么这里会出现这种情况?如果你真的测试我的答案,你会发现它是有效的。
my $array =  *{$ref}{ARRAY};