Причина, по которой я хочу использовать анонимные субтитры вместо названных, заключается в том, что я хочу определить эти подмножества внутри подкомпонентов Мейсона (http://www.masonbook.com/book/chapter-2.mhtml#TOC-ANCHOR-7), которые не ведут себя хорошо с названными subs.Безопасно ли рекурсивно вызывать один анонимный субподрядчик из другого?
E.g. если я пишу код таким образом:
my ($first, $second);
$first = sub {
my $val = shift;
print "val: $val";
$second->($val);
};
$second = sub {
my $val = shift;
if (0 < $val) {
$val = $val - 1;
$first->($val);
}
};
$first->(10);
Есть ли какие-либо скрытые подводные камни (утечки памяти, например и т.д.). В этом подходе?
Как пояснил @Schwern, память для этих подпрограмм не будет выпущена Perl, так как между ними существует круговая ссылка.
Но более конкретно, будет ли распределение памяти расти линейно, поскольку увеличивается значение $ val или оно не зависит от глубины стека вызовов? Потому что я могу поместить эти субмарины в mason <% once> blocks, и в этом случае эти subs будут инициализированы только один раз.
Спасибо, ребята! Но в основном, если я определяю анонимные субтитры вне цикла, мой объем памяти не будет повышаться? – Yakov
Петля только преувеличивает проблему; вам все равно придется отменить $ first или $ second функцию, чтобы избежать круговой структуры. –
@Yakov Петля только для иллюстрации утечки. Он A) предоставляет лексический контекст (т. Е. Блок), в котором подпрограммы в противном случае были бы уничтожены при выходе, а B) преувеличивает утечку памяти, поэтому он будет отображаться в грубом инструменте, таком как 'ps'. – Schwern