Можно еще eval использовать:

 eval("push \@{${class}::STORAGE}, \$key");

 eval("\@data = \@{${class}::STORAGE}");



1 ноября 2014 г., 0:43 пользователь Андрей Фёдоров <[email protected]>
написал:

> @class::STORAGE - обращение к переменной @STORAGE в модуле 'class'
>
> Чтобы обратиться к переменной в нужном классе, можно заменить на
> no strict 'refs';
> push @{"${class}::STORAGE"}, $key;
>
> 2014-10-31 23:09 GMT+03:00 Artur Kh <[email protected]>:
>
>> Привет,
>>
>> возникла необходимость хранить данные в переменной внутри модуля довольно
>> необычным способом. Примерно так, как это делается в DBIx::Class когда
>> описывается модель.
>>
>> Вот пример:
>>
>> use strict;
>> use warnings;
>>
>> use feature 'say';
>>
>> package BasePackage;
>>
>> my @STORAGE = ('key9');
>>
>> sub add {
>>     my ($class, $key) = @_;
>>     say "add $class <- $key";
>>     push @class::STORAGE, $key;
>> }
>>
>> sub list {
>>     my $class = shift;
>>     my @data = @class::STORAGE;
>>     print "$class: ";
>>     local $, = ',';
>>     say @data;
>> }
>>
>> package FirstPackage;
>>
>> our @ISA = ('BasePackage');
>>
>> __PACKAGE__->add('key0');
>> __PACKAGE__->add('key1');
>>
>> package SecondPackage;
>>
>> our @ISA = ('BasePackage');
>>
>> __PACKAGE__->add('key2');
>> __PACKAGE__->add('key3');
>>
>> package main;
>>
>> FirstPackage->list;
>> SecondPackage->list;
>>
>> 1;
>>
>> И вот вывод:
>>
>> $ perl package.pl
>> add FirstPackage <- key0
>> add FirstPackage <- key1
>> add SecondPackage <- key2
>> add SecondPackage <- key3
>> FirstPackage: key0,key1,key2,key3
>> SecondPackage: key0,key1,key2,key3
>>
>> Как видно набор значений выводится идентичный для обоих модулей, хотя
>> задумывалось иначе.
>>
>> Вот это я ожидал увидеть:
>>
>> FirstPackage: key0,key1
>> SecondPackage: key2,key3
>>
>> Как мне получить на выходе ожидаемый вывод?
>>
>> --
>> ak
>>
>> --
>> Moscow.pm mailing list
>> [email protected] | http://moscow.pm.org
>>
>>
>
> --
> Moscow.pm mailing list
> [email protected] | http://moscow.pm.org
>
>


-- 
Ksenia Bobrova
Senior Perl Developer
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить