it-swarm.dev

In Perl, qual è la differenza tra un file .pm (modulo Perl) e .pl (script Perl)?

Qual è la differenza tra .pm (Modulo Perl) e .pl (Script Perl)?

Per favore, dimmi anche perché torniamo 1 dal file. Se restituisce 2 o qualsiasi altra cosa, non sta generando alcun errore, quindi perché restituiamo 1 dal modulo Perl?

83
user380979

Fondamentalmente, l'estensione del file che usi non fa alcuna differenza sul modo in cui Perl interpreta questi file.

Tuttavia, inserendo i moduli in .pm i file che seguono una determinata struttura di directory che segue il nome del pacchetto offrono una comodità. Quindi, se hai un modulo Example::Plot::FourD e lo metti in una directory Example/Plot/FourD.pm in un percorso nel tuo @INC , quindi use e require farà la cosa giusta quando viene dato il nome del pacchetto come in use Example::Plot::FourD.

Il file deve restituire true come ultima istruzione per indicare la corretta esecuzione di qualsiasi codice di inizializzazione, quindi è consuetudine terminare tale file con 1; a meno che tu non sia sicuro che tornerà vero altrimenti. Ma è meglio solo mettere il 1;, nel caso in cui aggiungi più dichiarazioni.

Se EXPR è una parola nuda, require assume l'estensione ".pm" e sostituisce "::" con "/" nel nome del file, per semplificare il caricamento dei moduli standard. Questa forma di caricamento dei moduli non rischia di alterare il tuo spazio dei nomi.

Tutto ciò che use fa è capire il nome del file dal nome del pacchetto fornito, require in un blocco BEGIN e invocare import sul pacchetto. Non c'è nulla che ti impedisca di non utilizzare use ma di eseguire questi passaggi manualmente.

Ad esempio, di seguito inserisco il Example::Plot::FourD pacchetto in un file chiamato t.pl, caricato in uno script nel file s.pl.

C:\Temp> cat t.pl
package Example::Plot::FourD;

use strict; use warnings;

sub new { bless {} => shift }

sub something { print "something\n" }

"Example::Plot::FourD"

C:\Temp> cat s.pl
#!/usr/bin/Perl
use strict; use warnings;

BEGIN {
    require 't.pl';
}

my $p = Example::Plot::FourD->new;
$p->something;


C:\Temp> s
something

Questo esempio mostra che i file dei moduli non devono finire in 1, qualsiasi valore vero farà.

74
Sinan Ünür