Можно еще 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