2008-10-10 14 views
37

Si defino una constante en un módulo Perl, ¿cómo uso esa constante en mi programa principal? (¿O cómo puedo llamar a esa constante en el programa principal?)¿Cómo uso las constantes de un módulo Perl?

+0

Es mejor evitar el paquete "constante". http://earino.wordpress.com/2013/02/27/use-constant-will-surprise-you-with-its-evil/ Alternativas aquí: http://neilb.org/reviews/constants.html – nslntmnx

Respuesta

45

Las constantes se pueden exportar al igual que otros símbolos del paquete. Utilizando el módulo estándar Exporter, puede exportar las constantes de un paquete como este:

package Foo; 
use strict; 
use warnings; 

use base 'Exporter'; 

use constant CONST => 42; 

our @EXPORT_OK = ('CONST'); 

1; 

Luego, en un script de cliente (u otro módulo)

use Foo 'CONST'; 
print CONST; 

Puede usar el hash %EXPORT_TAGS (ver el Documentación del exportador) para definir grupos de constantes que se pueden exportar con un solo argumento de importación.

Actualización: Aquí hay un ejemplo de cómo usar la característica %EXPORT_TAGS si tiene múltiples constantes.

use constant LARRY => 42; 
use constant CURLY => 43; 
use constant MOE => 44; 

our @EXPORT_OK = ('LARRY', 'CURLY', 'MOE'); 
our %EXPORT_TAGS = (stooges => [ 'LARRY', 'CURLY', 'MOE' ]); 

entonces se puede decir

use Foo ':stooges'; 
print "$_\n" for LARRY, CURLY, MOE; 
+0

use Exportador 'importación'; es mejor, pero requerirá actualizar Exporter en perl's anterior a 5.8.3. –

+3

por favor explique por qué está usando 'importar' mejor? –

+0

Lo mejor es evitar el paquete "constante". http://earino.wordpress.com/2013/02/27/use-constant-will-surprise-you-with-its-evil/ Alternativas aquí: http://neilb.org/reviews/constants.html – nslntmnx

24

Las constantes son sólo los submarinos con prototipo de vacío, por lo que se pueden exportar como cualquier otro sub.

# file Foo.pm 
package Foo; 
use constant BAR => 123; 
use Exporter qw(import); 
our @EXPORT_OK = qw(BAR); 


# file main.pl: 
use Foo qw(BAR); 
print BAR; 
21

Para ampliar las respuestas anteriores, dado que las constantes son en realidad submarinos, puede también llamar directamente:

use Foo; 
print Foo::BAR; 
+5

No se refiera a las respuestas como arriba, porque si su respuesta se vota lo suficiente, puede terminar por encima de ellas. –

17

Es posible que desee considerar el uso de Readonly en lugar de constante.

+0

¿Por qué? ¿Qué pasa con la constante? – moritz

+1

No puede hacer esto con él: imprimir "constante es $ constante"; o esto: print $ hash {constant}; –

+2

Dado que 'use constant' crea una subrutina, hay problemas inesperados => sin interpolación de cadenas, dificultad para usar como una clave hash. Consulte los documentos para Readonly [https://metacpan.org/module/Readonly#COMPARISON-WITH-use-constant]. Solo use las partes internas de perl para marcar directamente una variable como de solo lectura. Readonly es lento (a menos que se use Readonly :: XS) y no se ha mantenido.Ver también Data :: Lock y Const :: Fast para diferentes implementaciones. – spazm

8
package Foo; 
use Readonly; 
Readonly my $C1 => 'const1'; 
Readonly our $C2 => 'const2'; 
sub get_c1 { return $C1 } 
1; 

perl -MFoo -e 'print "$_\n" for Foo->get_c1, $Foo::C2' 
6

a añadir a la bolsa de trucos, ya que una constante es simplemente una subrutina incluso se puede llamar como un método de clase.

package Foo; 
use constant PI => 3.14; 

print Foo->PI; 

Si usted tiene un montón de constantes es una buena manera de conseguir en el que de vez en cuando sin tener que exportar a todos. Sin embargo, a diferencia de Foo::PI o exportando PI, Perl no compilará Foo->PI por lo que incurrirá en el costo de una llamada a método (que probablemente no importe).

Cuestiones relacionadas