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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top