Domanda

Aiuta Perlers!Qualcuno sa che un semplice approccio "inserisci il codice qui" porterebbe il codice da file esterni una volta in fase di compilazione in un pacchetto?

Sfondo:

Ho una lezione inside-out standard in stile PBP che sta diventando piuttosto numerosa.Voglio dividere il codice in più file ma non estendere la classe.In modo ottimale, inserirei semplicemente il codice nella sezione "Magic JuJu" del modulo di esempio (vedi sotto) una volta in fase di compilazione.

Ho considerato AutoLoader come un mezzo per ottenere questo risultato.Ci sono però due cose che mi fanno riflettere.Se potessi aggirarli, potrebbe essere una soluzione quasi ottimale:

  1. Non voglio dividere ogni piccolo sottotitolo in un file separato;solo alcuni file di dimensioni più ragionevoli (usare sub stub nel chiamante va bene, però);E

  2. Non voglio rinviare la compilazione su ogni sub;alcuni sottotitoli che mi piacerebbe aver compilato al momento dell'utilizzo iniziale.Tuttavia, questo probabilmente non è un problema.

So che Moose fornisce "Ruoli", che credo lo faccia bene, ma per vari motivi Moose non è un'opzione per questo progetto, né lo è Mouse.

Ho usato "require q(some/file)" nella posizione "Magic JuJu", ma ciò non mantiene l'ambito della variabile persistente, ovverosubs dal file esterno non "vedono" correttamente gli hash degli attributi dell'oggetto (in altre parole, inserire require all'inizio del file avrebbe lo stesso effetto).Potrei aggirare il problema usando sempre setter e getter.Quindi questo non è un problema, ma richiederebbe un po' di tempo di codifica e un sovraccarico di esecuzione che preferirei non sostenere.

Infine, non voglio prolungare la lezione;ha già ereditarietà multipla.Voglio solo che un semplice approccio "inserisci il codice qui" porti il ​​codice una volta in fase di compilazione.

In sintesi:

  1. (Obbligatorio) importa il codice da file esterni nello spazio dei nomi del pacchetto
  2. (Obbligatorio) Lo fa solo in fase di compilazione o con un sovraccarico minimo di runtime
  3. (Obbligatorio) Non estende la lezione
  4. (Desiderato) Lode inserisce l'ambito della posizione

Codice di esempio con il commento "Magic JuJu" di seguito:

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;

Forse un blocco BEGIN con slurp ed eval ...

È stato utile?

Soluzione

Potresti semplicemente utilizzare i moduli e importare i sottotitoli desiderati.

use MyMod qw( wanted_sub_1 wanted_sub2 );

Per ottenere l'accesso agli hash degli attributi dovrai modificare import per i moduli di destinazione.

package MyClass;
use MyMod { attrib1 => \%attrib1, attrib2 => \%attrib2 }, qw( wanted_sub1 wanted_sub2 );

MyMod'S import creerebbe quindi riferimenti di codice chiusi sull'argomento hash iniziale e li installerebbe nel file MyClass spazio dei nomi.

Altri suggerimenti

Se sei disposto a convivere con le conseguenze, c'è Filtro::Macro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top