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

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 пользователь Харпалёв Иван <
[email protected]> написал:

> Доброго времени суток, могучий MoscowPM;
>
> Скажите, есть ли какие-то решения, чтобы кусок кода выполнялся ровно один
> раз? ( за время жизни программы)
>
> например
>
> for (...) {
>        do_once { code to be executed only once };
>        ....
> }
> do_once  { some_more() };
>
> Или как такое посоветуете делать?
> Чтобы по caller определялось, место вызова и куда-то запоминалось или ещё
> как-то?
>
> С уважением
>
>
> --
> Moscow.pm mailing list
> [email protected] | http://moscow.pm.org
>
>
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить