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


88

Qual è la differenza tra file .pm(Perl module) e .pl(Perl script)?

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


11
1non importa. Può essere 2, può essere "foo", può essere ["a", "list"]. Ciò che conta è che non lo è 0o qualsiasi altra cosa che venga valutata come falsa o usefallirebbe.
Amadan

.pl è in realtà una libreria perl - gli script perl, come i programmi in C oi programmi scritti in altri linguaggi, non hanno una fine, tranne che sui sistemi operativi che ne richiedono uno per funzionare, come Windows.
Ricorda Monica il

Risposte:


78

In fondo, l'estensione del file che usi non fa differenza su come perl interpreta quei file.

Tuttavia, l'inserimento di moduli nei .pmfile seguendo una determinata struttura di directory che segue il nome del pacchetto fornisce una comodità. Quindi, se hai un modulo Example::Plot::FourDe lo metti in una directory Example/Plot/FourD.pmin un percorso nel tuo @INC, allora usee requirefarà la cosa giusta quando gli viene dato il nome del pacchetto come in use Example::Plot::FourD.

Il file deve restituire true come ultima istruzione per indicare l'esecuzione corretta di qualsiasi codice di inizializzazione, quindi è consuetudine terminare un file di questo tipo con a 1; meno che non si sia sicuri che restituirà true altrimenti. Ma è meglio mettere solo il 1;, nel caso in cui si aggiungano più dichiarazioni.

Se EXPRè una parola semplice, requireassume un'estensione ".pm" e sostituisce "::" con "/" nel nome del file, per facilitare il caricamento dei moduli standard. Questa forma di caricamento dei moduli non rischia di alterare il tuo spazio dei nomi.

Tutto quello che usefa è capire il nome del file dal nome del pacchetto fornito, requirein un BEGINblocco e invocare importsul pacchetto. Non c'è nulla che ti impedisca di non utilizzare usema di eseguire manualmente questi passaggi.

Ad esempio, di seguito ho inserito il Example::Plot::FourDpacchetto in un file chiamato t.pl, l'ho caricato in uno script in 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 del modulo non devono terminare con 1, qualsiasi valore vero andrà bene.


-2

Un .pl è un singolo script.

In .pm ( Perl Module ) hai funzioni che puoi usare da altri script Perl:

Un modulo Perl è un pezzo autonomo di codice Perl che può essere utilizzato da un programma Perl o da altri moduli Perl. È concettualmente simile a una libreria di collegamento C o una classe C ++.


5
"Un .pl è un singolo script." Non vero. È solo su sistemi operativi danneggiati che è necessario identificare i programmi Perl con estensione .pl. E originariamente .pl indicava una "libreria Perl" - subroutine esterne caricate con un comando "require" o "do".
Dave Cross
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.