Como posso importar código Perl de arquivos externos no horário de compilação?
-
21-09-2019 - |
Pergunta
Ajude Perlers! Alguém sabe que uma abordagem simples de "Código de inserção aqui" traria código de arquivos externos uma vez no horário de compilação para um pacote?
Fundo:
Eu tenho uma classe de dentro para fora do estilo PBP padrão que está ficando bastante grande. Quero dividir o código em vários arquivos, mas não estender a classe. Otimamente, eu simplesmente inseria o código na seção "Magic juju" do módulo de exemplo (veja abaixo) uma vez no momento da compilação.
Eu olhei para o AutoLoader como um meio de conseguir isso. No entanto, há duas coisas que me dão uma pausa. Se eu pudesse contornar isso, pode ser uma solução quase ideal:
Não quero dividir cada pequeno sub em um arquivo separado; Apenas alguns arquivos de tamanho razoável (usando sub -estubes no chamador é bom); e
Não quero adiar a compilação em todos os sub; Alguns subs que eu gostaria de ter compilado no uso inicial. No entanto, isso provavelmente não é um quebra de negócio.
Sei que Moose fornece "papéis", que acredito que fazem isso bem, mas por várias razões, o Moose não é uma opção para este projeto, nem é o mouse.
Eu usei "requer q (algum/arquivo)" no local "Magic juju", mas isso não mantém o escopo variável persistente, ou seja, subs do arquivo externo não "veja" o atributo de objeto Hashes corretamente (em ainda Outras palavras, colocar a necessidade na parte superior do arquivo teria o mesmo efeito). Eu poderia contornar isso sempre usando setters e getters. Portanto, isso não é um quebra de negócio, mas exigiria um pouco de tempo de codificação e sobrecarga de execução que eu prefiro não incorrer.
Finalmente, não quero estender a classe; Já tem herança múltipla. Eu só quero que uma abordagem simples de "Código de inserção aqui" traria o código uma vez no momento da compilação.
Resumindo:
- (Exigido) Importa código de arquivos externos em namespace de pacotes
- (Exigido) o faz apenas no tempo de compilação ou no tempo de execução mínimo
- (Necessário) não estende a classe
- (Desejado) Honras Insira o escopo de localização
Exemplo Código com "Magic Juju" Comentário abaixo:
package T;
use strict;
use warnings;
########## BEGIN object persistent variables scope block ############
{
my %Attr_Name_Env;
## Constructor 'new'
#
sub new {
## Get and confirm arguments
#
my $class = shift;
my $href_arg = {@_};
my $name_env = $href_arg->{'name_env'};
## Bless anon scalar into class
#
my $obj_new = bless anon_scalar(), $class;
my $idx_self = ident $obj_new;
# Populate object attributes
#
$Attr_Name_Env{ $idx_self } = $name_env;
return $obj_new;
}
## END Constructor 'new'
sub DESTROY {... as you do ...}
sub t_get_name_env {
my $self = shift;
my $idx_self = ident $self;
return $Attr_Name_Env{ $idx_self };
}
## insert magic juju here
}
########## END object persistent variables scope block ############
1;
Talvez um bloco de início com um slurp e avaliação ...
Solução
Você pode simplesmente usar os módulos e importar os subs desejados.
use MyMod qw( wanted_sub_1 wanted_sub2 );
Para obter acesso aos seus hashes de atributo, você precisará modificar import
para seus módulos de destino.
package MyClass;
use MyMod { attrib1 => \%attrib1, attrib2 => \%attrib2 }, qw( wanted_sub1 wanted_sub2 );
MyMod
's import
criaria então os refs de código que estão fechados sobre o argumento inicial do hash e os instalar MyClass
espaço para nome.
Outras dicas
Se você está disposto a viver com as consequências, existe Filtro :: macro.