Che cosa significa “1;” significa in Perl?
-
20-09-2019 - |
Domanda
Mi sono imbattuto in un paio di moduli Perl che, per esempio simile al seguente codice:
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 del Sub?
Soluzione
1
al termine di un modulo significa che i rendimenti del modulo true
a use/require
dichiarazioni. Può essere utilizzata per indicare se l'inizializzazione modulo è successo. In caso contrario, use/require
fallirà.
$somevar
è una variabile che è accessibile solo all'interno del blocco. E 'utilizzato 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;
}
Altri suggerimenti
Quando si carica un modulo "Foo" con use Foo
o require()
, perl esegue il file Foo.pm
come uno script ordinario. Si aspetta che ritorni un valore vero se il modulo è stato caricato correttamente. Il 1;
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 venga cancellata in ogni invocazione di Somesub
(che sarebbe il caso se è stato dichiarato all'interno del corpo della funzione). Questo linguaggio è stato superato nelle versioni più recenti di Perl (5.10 in su) che hanno il statali parola chiave.
I moduli devono restituire un valore vero. 1
è un vero valore.
moduli Perl devono restituire qualcosa che restituisce true. Se non lo fanno, 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>
Anche se è consuetudine utilizzare "1;"., Tutto ciò che restituisce true lavorerà
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)
ovvie ragioni un altro valore di ritorno popolare è 42 .
C'è un elenco di valori di ritorno fredde mantenute a http://returnvalues.useperl.at/values. html .
Le parentesi graffe limitano il campo di applicazione del $ somevar variabile locale:
{ my $ somevar; ... } # $ Ambito del somevar finisce qui
Dalla documentazione per richiede :
Il file deve restituire true come l'ultimo dichiarazione per indicare il successo esecuzione di qualsiasi codice di inizializzazione, quindi è consuetudine terminare tale file con 1; se non sei sicuro che return true altrimenti. Ma è meglio solo per mettere la 1; , Nel caso in cui si aggiunge più istruzioni.
Non so molto di Perl, ma di solito si crea un ambito utilizzando parentesi graffe. Probabilmente $ somevar shoudln't essere disponibile a livello globale?