2008-10-10 18 views
37

Jeśli zdefiniuję stałą w module Perla, w jaki sposób mogę użyć tej stałej w moim głównym programie? (Lub jak mogę wywołać tę stałą w programie głównym?)Jak używać stałych z modułu Perla?

+0

Najlepiej unikać pakietu "stałego". http://earino.wordpress.com/2013/02/27/use-constant-will-surprise-you-with-its-evil/ Alternatywy tutaj: http://neilb.org/reviews/constants.html – nslntmnx

Odpowiedz

45

Stałe można eksportować tak jak inne symbole paczek. Przy użyciu standardowego modułu Exporter można wyeksportować stałych z pakietu tak:

package Foo; 
use strict; 
use warnings; 

use base 'Exporter'; 

use constant CONST => 42; 

our @EXPORT_OK = ('CONST'); 

1; 

Następnie w skrypcie klienckim (lub innego modułu)

use Foo 'CONST'; 
print CONST; 

można użyć %EXPORT_TAGS hash (patrz Dokumentacja eksportera), aby zdefiniować grupy stałych, które można wyeksportować za pomocą pojedynczego argumentu importu.

Aktualizacja: Oto przykład użycia funkcji %EXPORT_TAGS, jeśli masz wiele stałych.

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' ]); 

Wtedy można powiedzieć

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

wykorzystanie Eksporter "import"; jest lepszy, ale będzie wymagał uaktualnienia Eksportera na perlu wcześniejszym niż 5.8.3. –

+3

proszę wyjaśnić, dlaczego lepiej używasz "importu"? –

+0

Najlepiej unikać pakietu "stałego". http://earino.wordpress.com/2013/02/27/use-constant-will-surprise-you-with-its-evil/ Alternatywy tutaj: http://neilb.org/reviews/constants.html – nslntmnx

24

Stałe są tylko kanapki z pustym prototyp, więc mogą być eksportowane jak każdy inny 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

Aby rozwinąć na wcześniejszych odpowiedzi, ponieważ stałe są naprawdę tylko kanapki, można również nazywają je wprost:

use Foo; 
print Foo::BAR; 
+5

Nie odwołuj się do odpowiedzi jako powyżej, ponieważ jeśli twoja odpowiedź zostanie odpowiednio przegłosowana, może skończyć się powyżej. –

17

Można rozważyć użycie Readonly zamiast stała.

+0

Dlaczego? Co jest nie tak ze stałą? – moritz

+1

Nie można tego zrobić za pomocą: print "constant is $ constant"; lub to: print $ hash {constant}; –

+2

Ponieważ "stała użycia" tworzy podprogram, występują nieoczekiwane problemy => brak interpolacji ciągów, trudności w użyciu jako klucz skrótu. Zobacz dokumenty dla Readonly [https://metacpan.org/module/Readonly#COMPARISON-WITH-use-constant]. Readonly użyj elementów wewnętrznych perla, aby bezpośrednio oznaczyć zmienną jako tylko do odczytu. Readonly jest powolny (chyba że używa się Readonly :: XS) i nie jest utrzymywany.Zobacz także Data :: Lock i Const :: Fast dla różnych implementacji. – 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

Aby dodać do sztuczek, ponieważ stała jest tylko podprogram można nawet nazwać jako metoda klasy.

package Foo; 
use constant PI => 3.14; 

print Foo->PI; 

Jeśli masz dużo stałych, to jest to dobry sposób na od czasu do czasu, bez konieczności eksportowania wszystkich. Jednak w przeciwieństwie do Foo::PI lub eksportu PI, Perl nie skompiluje się Foo->PI, więc poniesiesz koszt wywołania metody (co prawdopodobnie nie ma znaczenia).

Powiązane problemy