33 votes

Que signifie "1;" dire en Perl?

J'ai rencontré quelques modules Perl qui par exemple ressemblent au code suivant:

 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;
 

Quelle est la signification de 1; et des accolades qui entourent le $somevar et le Sub?

67voto

Ivan Nevostruev Points 14934

1 à la fin d'un module signifie que le module retourne true de use/require des déclarations. Il peut être utilisé pour indiquer si l'initialisation du module est réussi. Sinon, use/require échouent.

$somevar est une variable qui est accessible uniquement à l'intérieur du bloc. Il est utilisé pour simuler "statique" des variables. À partir de Perl 5.10, vous pouvez utiliser le mot-clé state mot-clé pour avoir les mêmes résultats:

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

11voto

tsee Points 4371

Lorsque vous chargez un module "Foo" avec use Foo ou require(), perl exécute l' Foo.pm le fichier comme un ordinaire script. Il s'attend à ce qu'il renvoie une valeur true si le module a été chargé correctement. L' 1; le fait. Il pourrait être 2; ou "hey there"; tout aussi bien.

Le bloc autour de la déclaration de l' $somevar et la fonction Somesub limite la portée de la variable. De cette façon, il est uniquement accessible à partir d' Somesub et n'est pas effacé à chaque invocation d' Somesub (ce qui serait le cas si elle a été déclarée à l'intérieur du corps de la fonction). Cet idiome a été remplacé dans les versions récentes de perl (5.10 et plus) qui ont l' état d'un mot clé.

8voto

Quentin Points 325526

Les modules doivent retourner une vraie valeur. 1 est une vraie valeur.

8voto

Ed Guiness Points 21866

Les modules Perl doit retourner quelque chose qui prend la valeur true. S'ils ne le font pas, Perl signale une erreur.

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>

Bien qu'il est de coutume d'utiliser "1;", quelque chose qui donne à la volonté réelle de travail.

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)

Pour des raisons évidentes, une autre valeur de retour est 42.

Il y a une liste de super valeurs de retour maintenue à http://returnvalues.useperl.at/values.html.

4voto

Pim Points 555

Les accolades limitent la portée de la variable locale $ somevar:

{mon $ somevar; ...} # La portée de $ somevar se termine ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X