在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
fromSymbol
模块
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};