Чтение другой таблицы символов пакетов в Perl - PullRequest
3 голосов
/ 17 апреля 2010

Я пытаюсь прочитать глобальный символ из другого пакета. У меня есть имя пакета в виде строки. Я использую 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 голосов
/ 18 апреля 2010

Вы также можете сделать это без использования внешнего модуля, как описано в 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 .

4 голосов
/ 18 апреля 2010

Функция qualify_to_ref возвращает ссылку на typeglob, с которой вы можете отменить ссылку следующим образом:

my @array =  @{*$ref};

Синтаксис разыменования typeglob задокументирован здесь .

1 голос
/ 20 апреля 2010

Помимо того, что FM уже заметил, вы можете получить доступ к определенным частям глобуса через хеш-подобный интерфейс:

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

Это может быть удобно для доступа к частям, таким как IO, которые не имеют сигил. У меня есть глава о подобных вещах в Мастеринг Perl .

0 голосов
/ 18 апреля 2010

Вам нужно разыменовать его: @ $$ ref вместо @ $ ref

...