/ / Como chamar um sub de módulo dentro de outro sub de módulo em Perl - perl

Como chamar um sub de módulo dentro de outro sub de módulo em Perl - perl

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.pme 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 № 1

Existe 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 atual
    • import a função commonFunc 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.