2009-12-21 28 views
33

mi sono imbattuto in un paio di moduli Perl che, per esempio simile al seguente codice:Che cosa significa "1;" significa in Perl?

package MyPackage; 

use strict; 
use warnings; 
use constant PERL510 => ($] >= 5.0100); 

require Exporter; 

our @ISA = qw(Exporter); 
our @EXPORT = qw(); 

{ #What is the significance of this curly brace? 

    my $somevar; 

    sub Somesub { 
     #Some code here 
    } 
} 

1; 

Qual è il significato di 1; e delle parentesi graffe che racchiudono il $somevar e il Sub?

+2

Inoltre, [Perché è necessario inserire un 1 alla fine di un modulo perl5?] (Http://stackoverflow.com/questions/3606528/why-do-you-have-to-put- a-1-at-the-end-of-a-perl-5-module) e [Cool return values] (http://returnvalues.useperl.at/values.html). – Lazer

+0

Sono deluso dal fatto che tchrist non abbia presentato una risposta per questo. –

+0

Tecnicamente, si tratta di due domande in una. Normalmente cerco di stroncarli sul nascere e di modificare una domanda prima che arrivino le risposte, ma ora è troppo tardi. – Flimm

risposta

65

1 alla fine di un modulo significa che il modulo restituisce true alle istruzioni use/require. Può essere usato per dire se l'inizializzazione del modulo ha successo. Altrimenti, use/require avrà esito negativo.

$somevar è una variabile accessibile solo all'interno del blocco. È usato per simulare variabili "statiche". A partire da Perl 5.10 è possibile utilizzare parole chiave state parola chiave per avere gli stessi risultati:

## Starting from Perl 5.10 you can specify "static" variables directly. 
sub Somesub { 
    state $somevar; 
} 
+6

Voto in eccesso perché questa risposta è sia concisa che corretta e risponde effettivamente a tutte le domande dei genitori. – daxim

4

Le parentesi graffe limitare l'ambito locale variabile $ somevar:

{ mio $ somevar; ... } # $ L'ambito di somevar termina qui

8

I moduli devono restituire un valore reale. 1 è un valore vero.

1

Non so molto di Perl, ma di solito si crea un ambito usando parentesi graffe. Probabilmente $ somevar non sarà disponibile a livello globale?

11

Quando si carica un modulo "Foo" con use Foo o require(), perl esegue il file Foo.pm come un normale script. Si aspetta che restituisca un valore vero se il modulo è stato caricato correttamente. Lo 1; lo fa. Potrebbe essere 2; o "hey there"; altrettanto bene.

Il blocco attorno alla dichiarazione di $somevar e la funzione Somesub limita l'ambito della variabile. In questo modo, è accessibile solo da Somesub e non viene cancellato in ogni richiamo di Somesub (che sarebbe il caso se fosse stato dichiarato all'interno del corpo della funzione). Questo idioma è stato sostituito nelle versioni recenti di perl (5.10 e versioni successive) che hanno la parola chiave state.

8

moduli Perl devono restituire qualcosa che restituisce true. In caso contrario, Perl segnala un errore.

C:\temp>cat MyTest.pm 
package MyTest; 
use strict; 
sub test { print "test\n"; } 
#1; # commented out to show error 

C:\temp>perl -e "use MyTest" 
MyTest.pm did not return a true value at -e line 1. 
BEGIN failed--compilation aborted at -e line 1. 

C:\temp> 

Sebbene sia consuetudine utilizzare "1;", tutto ciò che viene valutato come vero funzionerà.

C:\temp>cat MyTest.pm 
package MyTest; 
use strict; 
sub test { print "test\n"; } 
"false"; 

C:\temp>perl -e "use MyTest" 

C:\temp> (no error here) 

Per obvious reasons un altro valore di ritorno popolare è .

C'è una lista di valori di ritorno freschi mantenuti a http://returnvalues.useperl.at/values.html.

4

Dalla documentazione per require:

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