Si je définis une constante dans un module Perl, comment utiliser cette constante dans mon programme principal? (Ou comment puis-je appeler cette constante dans le programme principal?)
Les constantes peuvent être exportées comme les autres symboles de package. En utilisant le module standard Exporter , vous pouvez exporter des constantes à partir d'un package comme celui-ci:
package Foo;
use strict;
use warnings;
use base 'Exporter';
use constant CONST => 42;
our @EXPORT_OK = ('CONST');
1;
Ensuite, dans un script client (ou autre module)
use Foo 'CONST';
print CONST;
Vous pouvez utiliser le %EXPORT_TAGS
hash (voir la documentation de l'exportateur) pour définir des groupes de constantes qui peuvent être exportées avec un seul argument d'importation.
Mise à jour: voici un exemple d'utilisation du %EXPORT_TAGS
fonctionnalité si vous avez plusieurs 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' ] );
Ensuite, vous pouvez dire
use Foo ':stooges';
print "$_\n" for LARRY, CURLY, MOE;
Les constantes ne sont que des sous-marins avec un prototype vide, elles peuvent donc être exportées comme tout autre sous-marin.
# 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;
Pour développer les réponses précédentes, puisque les constantes ne sont en fait que des sous-marins, vous pouvez aussi les appeler directement:
use Foo;
print Foo::BAR;
Vous voudrez peut-être envisager d'utiliser en lecture seule au lieu de constant.
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'
Pour ajouter au sac d'astuces, puisqu'une constante n'est qu'un sous-programme, vous pouvez même l'appeler comme méthode de classe.
package Foo;
use constant PI => 3.14;
print Foo->PI;
Si vous avez beaucoup de constantes, c'est une bonne façon de les utiliser occasionnellement sans avoir à toutes les exporter. Cependant, contrairement à Foo::PI
ou exportation PI
, Perl ne compilera pas Foo->PI
donc vous encourez le coût d'un appel de méthode (ce qui n'a probablement pas d'importance).