web-dev-qa-db-fra.com

Comment utiliser les constantes d'un module Perl?

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?)

41
PNMNS

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;
48
friedo

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;
26
moritz

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;
21
Tanktalus

Vous voudrez peut-être envisager d'utiliser en lecture seule au lieu de constant.

17
Berserk
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'
8
maletin

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).

6
Schwern