Como posso importar código Perl de arquivos externos no horário de compilação?

StackOverflow https://stackoverflow.com/questions/2282362

  •  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:

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

  2. 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:

  1. (Exigido) Importa código de arquivos externos em namespace de pacotes
  2. (Exigido) o faz apenas no tempo de compilação ou no tempo de execução mínimo
  3. (Necessário) não estende a classe
  4. (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 ...

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top