2010-08-04 34 views
76

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

Ti prego, dimmi anche il motivo per cui torniamo 1 da file. Se restituisci 2 o qualsiasi altra cosa, non genera alcun errore, quindi perché restituiamo 1 dal modulo Perl?

+10

'1' non importa. Può essere '2', può essere' "foo" ', può essere' ["a", "lista"] '. Ciò che importa è che non è "0", o qualsiasi altra cosa che viene valutata come falsa, o "uso" fallirebbe. – Amadan

+0

.pl è in realtà una libreria perl - gli script perl, come i programmi C oi programmi scritti in altre lingue, non hanno un finale, tranne che sui sistemi operativi che ne necessitano uno per functiopn, come Windows. –

risposta

-2

A .pl è un singolo script.

In .pm (Perl Module) si dispone di funzioni che è possibile utilizzare da altri script Perl:

modulo A 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 C link o a una classe C++.

+4

"A .pl è un singolo script." Non vero. È solo su sistemi operativi non funzionanti che è necessario identificare i programmi Perl con estensione .pl. E originariamentepl indicava una "libreria Perl" - subroutine esterne che hai caricato con un comando "require" o "do". –

65

Al centro, l'estensione di file utilizzata non fa differenza su come perl interpreta quei file.

Tuttavia, mettere i moduli in .pm file seguendo una certa struttura di directory che segue il nome del pacchetto fornisce una comodità. Quindi, se si dispone di un modulo Example::Plot::FourD e lo si inserisce in una directoryin un percorso nel proprio @INC, quindi use e require farà la cosa giusta quando viene indicato il nome del pacchetto come in use Example::Plot::FourD.

Il file deve restituire true come ultima istruzione per indicare l'esecuzione con successo di qualsiasi codice di inizializzazione, quindi è consuetudine terminare tale file con 1; meno che non siate sicuri che restituisca vero il contrario. Ma è meglio mettere semplicemente lo 1;, nel caso aggiungeste altre dichiarazioni.

Se EXPR è un bareword, il require assume un'estensione ".pm" e sostituisce '::' con '/' nel nome del file per voi, per rendere più facile il caricamento dei moduli standard. Questa forma di caricamento dei moduli non rischia di alterare il tuo spazio dei nomi.

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

Ad esempio, qui sotto ho messo il pacchetto Example::Plot::FourD in un file chiamato t.pl, caricato in uno script in un 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 dimostra che i file dei moduli non devono finire in 1, qualsiasi valore reale farà.

Problemi correlati