È obbligatorio che sia presente una cartella con il nome di un pacchetto per creare un pacchetto?

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

  •  19-08-2019
  •  | 
  •  

Domanda

Stiamo prendendo in considerazione il codice comune dal nostro progetto Perl. Un programma principale dovrebbe essere suddiviso in diversi moduli riutilizzabili.

Il nome del nostro programma è validate_results.pl che contiene una serie di comandi di validazione. Abbiamo in programma di dividerlo in piccoli moduli in modo che validate_results.pl dovrebbe essere come:

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

Secondo la mia comprensione, dovrei creare una cartella comune e sotto quel Validate_Results.pm dovrebbe essere presente. Sempre sotto Common , dovrebbe essere creata la cartella Validate_Results e sotto quelle CommonCommands e ReturnCodeValidation dovrebbero essere presenti.

È obbligatorio che tutte queste cartelle siano presenti o possiamo avere tutti i programmi Perl in una singola cartella e raggrupparli logicamente e comunque usare il modo sopra per accedere ai moduli (diciamo usa common :: validate_results come quello).

È stato utile?

Soluzione

È richiesta la gerarchia del filesystem. A :: B :: C sarà sempre situato in A / B / C.pm, da qualche parte in @INC.

Se devi aggirare il problema, leggi perldoc -f richiedi , cercando in particolare la sezione relativa ai riferimenti di subroutine in @INC. Sì, puoi fare in modo che il caricatore di moduli faccia cose strane se è quello che vuoi veramente; ma non è quello che vuoi, fidati di me. Basta attenersi alla convenzione, come fanno le altre applicazioni Perl del 99.9999999%.

Altri suggerimenti

Se vuoi "usare" i tuoi moduli, devi conformarti alla struttura. Se vuoi aggirare il problema, puoi invece "richiedere" i tuoi moduli, passando il nome file richiesto.

Non dovresti davvero farlo, comunque. Se davvero non vuoi avere una struttura di directory, eliminala dai nomi dei moduli (anche se questo può portare a problemi in futuro se hai un nome di modulo che è in conflitto con qualcosa di più generico di CPAN). Basta aggiungere la directory degli script al percorso INC tramite Find :: Bin e utilizzare direttamente i moduli:

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

HTH

Ecco un esempio di un modulo e dei suoi sottomoduli nello stesso file:

package Foo;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo' );

sub from_foo { print "from_foo\n"; }

package Foo::Bar;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo_bar' );

sub from_foo_bar { print "from_foo_bar\n"; }

1;

Nel tuo programma, se usi il modulo Foo (quello con un file .pm):

use Foo;

Avrai accesso alle funzioni Foo :: Bar , tranne che come nomi canonici (Foo :: Bar :: from_foo_bar). Puoi importarli in questo modo:

use Foo;
Foo::Bar->import;

Nota che non puoi farlo:

use Foo::Bar;

Perché non esiste alcun file Foo / Bar.pm .

Il nome del pacchetto in un comando 'use' è effettivamente solo un percorso che termina con un file .pm, quindi non è necessaria una cartella con il nome di ogni pacchetto. Nel tuo esempio, hai bisogno di cartelle:

Common
Common/Validate_Results

Ma non hai bisogno di cartelle:

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

Il nome del pacchetto effettivo nel file .pm non deve essere lo stesso del nome nel comando 'use' che lo carica. Ma mantenere i percorsi coerenti con i nomi dei pacchetti è sempre una buona idea.

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