我如何使用Perl模块中的常量?

如果我在一个Perl模块中定义一个常量,我该如何在我的主程序中使用这个常量? (或者我怎样在主程序中调用这个常量?)

常量可以像其他软件包符号一样导出。 使用标准的Exporter模块,你可以像这样从一个包中导出常量:

package Foo; use strict; use warnings; use base 'Exporter'; use constant CONST => 42; our @EXPORT_OK = ('CONST'); 1; 

然后,在客户端脚本(或其他模块)

 use Foo 'CONST'; print CONST; 

您可以使用%EXPORT_TAGS散列(请参阅导出器文档)来定义可以使用单个导入参数导出的常量组。

更新:如果您有多个常量,下面是如何使用%EXPORT_TAGSfunction的示例。

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

那么你可以说

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

常量只是空的原型,所以他们可以像任何其他子输出。

 # 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; 

为了扩大早期的答案,由于常量只是潜艇,你也可以直接调用它们:

 use Foo; print Foo::BAR; 

你可能要考虑使用Readonly而不是常量。

 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' 

要添加一些技巧,因为常量只是一个子程序,你甚至可以把它称为一个类方法。

 package Foo; use constant PI => 3.14; print Foo->PI; 

如果你有很多的常量,那么偶尔得到一个常量是一个很好的方法,而不必将它们全部导出。 但是,与Foo::PI或导出PI ,Perl不会编译出Foo->PI因此会产生方法调用的代价(这可能无关紧要)。