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?
Odpowiedz
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;
wykorzystanie Eksporter "import"; jest lepszy, ale będzie wymagał uaktualnienia Eksportera na perlu wcześniejszym niż 5.8.3. –
proszę wyjaśnić, dlaczego lepiej używasz "importu"? –
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
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;
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;
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. –
Można rozważyć użycie Readonly zamiast stała.
Dlaczego? Co jest nie tak ze stałą? – moritz
Nie można tego zrobić za pomocą: print "constant is $ constant"; lub to: print $ hash {constant}; –
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
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'
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).
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