Eu criei módulos Perl sob /my_project/ABC/
. o ABC
A pasta contém três módulos de sub-rotina: Build.pm
, Config.pm
e Operation.pm
. Existe uma sub-rotina comum em Operation.pm
que eu preciso acessar de Config.pm
, mas quando eu tentei eu jogo
"configureTheRepository" não é exportado pelo módulo ABC :: Config`.
Aqui está a pilha de chamadas.
Operation.pm
package ABC::Operation;
use strict;
use warnings;
use Term::ANSIColor qw(:constants);
use File::Basename qw(dirname);
use Exporter qw(import);
use Term::ANSIColor qw( colored );
use Data::Dumper qw(Dumper);
use JSON::PP;
use File::Basename qw(dirname);
use Cwd qw(abs_path);
use ABC::Config qw(configureTheRepository);
our @EXPORT = qw(commonFunc)
sub commonFunc{
#handle logic
}
1;
Config.pm
package ABC::Config;
use strict;
use warnings;
use Term::ANSIColor qw(:constants);
use File::Basename qw(dirname);
use Exporter qw(import);
use Cwd qw(abs_path);
use Cwd qw(abs_path);
use ABC::Operation qw(commonFunc); #Compilation failed when i insert this line.if i removed this my script will execute and but in runtime throws undefined commonFunc.
our @EXPORT = qw(configureTheRepository);
sub configureTheRepository{
#handle logic
}
1;
Por favor, deixe-me saber onde eu cometi o erro.
Respostas:
3 para resposta № 1Existe uma dependência circular. use
declarações são feitas em tempo de compilação. Isso significa que antes que qualquer código real seja executado. Então, quando você inicia seu programa, e a primeira coisa que faz é entrar em ABC::Operation
, acontecerá o seguinte:
- scan ABC :: Operação para
use
afirmações - Termo da carga :: ANSIColor
- a análise muda para Term :: ANSIColor
- Termo da verificação :: ANSIColor for
use
afirmações ...
- a análise volta para ABC :: Operation
- carregar File :: Basename
- a análise muda para File :: Basename
- Arquivo de varredura :: Nome de base
- a análise volta para ABC :: Operation
- ... mais alguns
- carregar ABC :: Config
- a análise muda para ABC :: Config
- digitalize ABC :: Config para
use
afirmações ...
- analisando bruxas de volta ao ABC :: Operação
import
coisas de Term :: ANSIColor, File :: Basename, Exportador e Cwd; estes não são carregados novamente porque o Perl já os carregou antes. Ele importa apenas os símbolos no namespace ABC :: Config atualimport
a funçãocommonFunc
do ABC :: Config; novamente, isso também já foi carregado, por isso não o carrega novamente- gera um erro porque, neste momento, o ABC :: Config ainda não concluiu a análise e ainda não exporta um
commonFunc
símbolo
Isso é um pouco confuso, mas é um sinal de que sua arquitetura está quebrada. Se as coisas são comuns, elas podem estar em um pacote comum. Mas esse pacote comum não podes use qualquer coisa que use. Se for esse o caso, o que quer que esteja usando, também se torna comum por definição.
A solução é repensar quais funções vãoOnde. Encontre as menores partes possíveis e coloque-as em um pacote. Essas são as coisas que todos os outros pacotes compartilham. Em seguida, use-o onde for necessário. As próximas coisas que usam isso não devem atrair um ao outro. Somente o último nível deve combinar todos eles. A árvore de dependência é chamada de árvore por um motivo. Ter um círculo lá não pode funcionar.