[Moscow.pm] __PACKAGE__ namespace

Антон Резников anton.n.reznikov на gmail.com
Пт Окт 31 16:06:48 PDT 2014


Предложу пожалуй свой вариант: https://gist.github.com/17e/07879edf40c70d66599d

anton на Currant:~$ perl /tmp/example.pl
add FirstPackage <- key0
add FirstPackage <- key1
add SecondPackage <- key2
add SecondPackage <- key3
FirstPackage: key0,key1
SecondPackage: key2,key3

31 октября 2014 г., 23:57 пользователь Ксения Боброва
<bobrovaksenia на gmail.com> написал:
> Можно еще eval использовать:
>
>  eval("push \@{${class}::STORAGE}, \$key");
>
>  eval("\@data = \@{${class}::STORAGE}");
>
>
>
> 1 ноября 2014 г., 0:43 пользователь Андрей Фёдоров <secrethost на gmail.com>
> написал:
>
>> @class::STORAGE - обращение к переменной @STORAGE в модуле 'class'
>>
>> Чтобы обратиться к переменной в нужном классе, можно заменить на
>> no strict 'refs';
>> push @{"${class}::STORAGE"}, $key;
>>
>> 2014-10-31 23:09 GMT+03:00 Artur Kh <khrt на ya.ru>:
>>>
>>> Привет,
>>>
>>> возникла необходимость хранить данные в переменной внутри модуля довольно
>>> необычным способом. Примерно так, как это делается в 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
>>> moscow-pm на pm.org | http://moscow.pm.org
>>>
>>
>>
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>
>
>
> --
> Ksenia Bobrova
> Senior Perl Developer
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>


Подробная информация о списке рассылки Moscow-pm