Dependências circulares acontecem quando sua biblioteca requer uma biblioteca que requer sua biblioteca. Aqui está um exemplo. Digamos que você tenha 2 pacotes:
AlienPlanet.pm
package AlienPlanet;
use Moose;
use Dinosaurs; # <--- Circular dependency
sub has_dinosaurs {1}
1;
Dinosaurs.pm
package Dinosaurs;
use Moose;
use AlienPlanet; # <--- Circular dependency
sub has_rabies {1}
1;
Se você tentar compilá-lo, receberá o seguinte aviso:
⚡ perl -c AlienPlanet.pm
Subroutine has_dinosaurs redefined at AlienPlanet.pm line 5.
AlienPlanet.pm syntax OK
Neste caso, é óbvio onde está o problema.
Mas se o pacote que você incluiu incluiu 25 outras bibliotecas, que incluiu outras bibliotecas, que incluiu sua biblioteca original – então será mais difícil descobrir onde está o círculo.
Felizmente descobri uma boa solução. Primeiro, modifique AlienPlanet.pm para ficar assim:
package AlienPlanet;
sub has_dinosaurs {1} <-- swap
use Dinosaurs; <-- swap
1;
Em seguida, tente compilar seu código novamente, mas desta vez com Carp :: Always :
⚡ perl -MCarp::Always -c AlienPlanet.pm
Subroutine has_dinosaurs redefined at AlienPlanet.pm line 4.
require AlienPlanet.pm called at Dinosaurs.pm line 4
Dinosaurs::BEGIN() called at AlienPlanet.pm line 4
eval {...} called at AlienPlanet.pm line 4
require Dinosaurs.pm called at AlienPlanet.pm line 5
AlienPlanet::BEGIN() called at AlienPlanet.pm line 4
eval {...} called at AlienPlanet.pm line 4
AlienPlanet.pm syntax OK
Agora você tem um rastreamento de pilha e é fácil ver onde está o seu problema. Tudo o que resta é descobrir como resolvê-lo. (Solução rápida: use Class :: Load no pacote Dinosaurs.)
Cross postado em blog.kablamo.org