2009-12-21 32 views
33

me he encontrado con algunos módulos Perl que, por ejemplo, un aspecto similar al siguiente código:¿Qué significa "1"? significa en 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; 

¿Cuál es el significado de 1; y de las llaves que encierran el $somevar y la Subcomisión?

+2

Además, [¿Por qué tiene que poner un 1 al final de un módulo perl5?] (Http://stackoverflow.com/questions/3606528/why-do-you-have-to-put- a-1-at-the-end-of-a-perl-5-module) y [Cool return values] (http://returnvalues.useperl.at/values.html). – Lazer

+0

Estoy decepcionado de que Tchrist no haya enviado una respuesta para esto. –

+0

Técnicamente, estas son dos preguntas en una. Normalmente intento cortarlos de raíz y editar una pregunta antes de que lleguen las respuestas, pero ya es demasiado tarde. – Flimm

Respuesta

65

1 al final de un módulo significa que el módulo devuelve true a use/require declaraciones. Se puede usar para decir si la inicialización del módulo fue exitosa. De lo contrario, use/require fallará.

$somevar es una variable a la que solo se puede acceder dentro del bloque. Se usa para simular variables "estáticas". A partir de Perl 5.10 se puede utilizar la palabra clave state palabra clave para tener los mismos resultados:

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

Votación a favor porque esta respuesta es a la vez concisa y correcta y en realidad responde todas las preguntas de los padres. – daxim

4

Las llaves limitar el alcance de la variable local $ somevar:

{ mi $ somevar; ... } # $ el alcance de algunos somevar aquí

8

Los módulos tienen que devolver un valor verdadero. 1 es un verdadero valor.

1

No sé mucho sobre Perl, pero normalmente se crea un ámbito con llaves. Probablemente $ somevar no estará disponible globalmente?

11

Cuando carga un módulo "Foo" con use Foo o require(), perl ejecuta el archivo Foo.pm como un script ordinario. Espera que devuelva un valor verdadero si el módulo se cargó correctamente. El 1; hace eso. Podría ser 2; o "hey there"; igual de bien.

El bloque alrededor de la declaración de $somevar y la función Somesub limita el alcance de la variable. De esta manera, sólo es accesible desde Somesub y no recibe aclaró en cada invocación de Somesub (que sería el caso si se declaró en el interior del cuerpo de la función). Este lenguaje ha sido reemplazado en las últimas versiones de Perl (5.10 en adelante) que tienen la palabra clave state.

8

módulos Perl deben devolver algo que se evalúa como verdadera. Si no lo hacen, Perl informa un error.

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> 

Aunque es costumbre usar "1;", todo lo que resulte verdadero funcionará.

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) 

Por otra obvious reasons valor de retorno popular es .

Hay una lista de valores de retorno geniales mantenidos en http://returnvalues.useperl.at/values.html.

4

De la documentación para require:

El archivo debe devolver verdadero como el último declaración para indicar éxito ejecución de cualquier código de inicialización, por lo que es habitual para poner fin a un archivo de este tipo con 1; a menos que esté seguro de que va a devolver verdadero de lo contrario. Pero es mejor solo para poner el 1; , en caso de que agregue más declaraciones.