[Moscow.pm] __PACKAGE__ namespace

Андрей Фёдоров secrethost на gmail.com
Пт Окт 31 13:43:51 PDT 2014


@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
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20141101/8a2b2f6f/attachment.html>


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