簡體   English   中英

在Perl中讀取另一個包符號表

[英]Reading another packages symbol table in Perl

我試圖從另一個包中讀取全局符號。 我將包名稱作為字符串。 我正在使用Symbol模塊中的qualify_to_ref

    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 ;

qualify_to_ref函數返回一個typeglob引用,您可以像這樣取消引用:

my @array =  @{*$ref};

此處記錄 typeglob解除引用語法。

您也可以在不使用外部模塊的情況下執行此操作,如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將變量導出到命名空間。

除了FM已經注意到的方式之外,您還可以通過類似哈希的接口訪問typeglob的特定部分:

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

這可以方便地到達沒有印記的部件,例如IO部分。 我在Mastering Perl中有一章關於這類內容。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM