[Moscow.pm] do_once { CODE };

Андрей Фёдоров secrethost на gmail.com
Пт Фев 7 09:43:22 PST 2014


Сходу придумалось вот такое:

for (1..5) {
  unless (state $done++) {
    say "once";
  }
  say;
}

Наверняка можно столкнуться с условиями, в которых работать не будет. Как
минимум для каждой копии анонимной функции создаётся своя переменная:

sub make {
  unless (state $done++) {
    # once
    say "init make";
  }
  return sub {
    # а тут уже не работает, в каждой sub { ... } своя копия $done
    unless (state $done++) {
      say "make";
    }
  }
}
make->();
make->();
make->();

say '---';
my $ref = make();
$ref->();
$ref->();
$ref->();



7 февраля 2014 г., 20:19 пользователь Харпалёв Иван <
ivan.kharpalev на gmail.com> написал:

> Доброго времени суток, могучий MoscowPM;
>
> Скажите, есть ли какие-то решения, чтобы кусок кода выполнялся ровно один
> раз? ( за время жизни программы)
>
> например
>
> for (...) {
>        do_once { code to be executed only once };
>        ....
> }
> do_once  { some_more() };
>
> Или как такое посоветуете делать?
> Чтобы по caller определялось, место вызова и куда-то запоминалось или ещё
> как-то?
>
> С уважением
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20140207/caf2ed6b/attachment-0001.html>


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