Тот факт, что они находятся в отдельных пакетах, не имеет ничего общего с тем, что он работает бесконечно, потребляя все доступные ресурсы. Вы вызываете два метода друг из друга. Это не круговая ссылка, это рекурсия , что не одно и то же. В частности, weaken
вам совсем не поможет. Вы получите точно такой же эффект от:
sub a {
b();
}
sub b {
a();
}
a();
Лучший способ избежать этого - не делайте этого . Более полезно, если вам приходится писать рекурсивные функции, старайтесь не использовать несколько функций в цепочке рекурсий, а просто одну, чтобы вам было легче мысленно отслеживать, где ваши вызовы должны завершаться.
Что касается того, как определить, происходит ли что-то подобное, вам нужно сделать что-то простое, например, увеличить переменную с глубиной рекурсии и завершить (или вернуть), если ваша глубина превышает определенное значение. Но вам действительно не нужно полагаться на это, это похоже на написание цикла while
и использование там приращения, чтобы убедиться, что ваша функция не выходит из-под контроля. Только не повторяйте набор, если вы не знаете, как и когда он заканчивается.
Другим важным вопросом будет то, что вы пытаетесь достичь в первую очередь?