<div dir="ltr"><div>Сходу придумалось вот такое:</div><div><br></div><div>for (1..5) {</div><div> unless (state $done++) { </div><div> say "once";</div><div> }</div><div> say;</div><div>}</div><div><br></div>
<div>Наверняка можно столкнуться с условиями, в которых работать не будет. Как минимум для каждой копии анонимной функции создаётся своя переменная:</div><div><br></div><div>sub make {</div><div> unless (state $done++) {</div>
<div> # once</div><div> say "init make";</div><div> }</div><div> return sub {</div><div> # а тут уже не работает, в каждой sub { ... } своя копия $done</div><div> unless (state $done++) {</div><div>
say "make";</div><div> }</div><div> }</div><div>}</div><div>make->();</div><div>make->();</div><div>make->();</div><div><br></div><div>say '---';</div><div>my $ref = make();</div><div>
$ref->();</div><div>$ref->();</div><div>$ref->();</div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">7 февраля 2014 г., 20:19 пользователь Харпалёв Иван <span dir="ltr"><<a href="mailto:ivan.kharpalev@gmail.com" target="_blank">ivan.kharpalev@gmail.com</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Доброго времени суток, могучий MoscowPM;<div><br></div><div>Скажите, есть ли какие-то решения, чтобы кусок кода выполнялся ровно один раз? ( за время жизни программы)</div>
<div><br></div><div>например</div><div>
<br></div><div>for (...) {</div>
<div> do_once { code to be executed only once };</div><div> ....</div><div>}</div><div>do_once { some_more() };</div><div><br></div><div>Или как такое посоветуете делать?</div><div>Чтобы по caller определялось, место вызова и куда-то запоминалось или ещё как-то?</div>
<div><br></div><div>С уважением</div><div><br></div></div>
<br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div><br></div>