当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用Perl模块中的常量?》经验,为你挑选了6个好方法。

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



1> friedo..:

可以像其他包符号一样导出常量.使用标准的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散列(请参阅Exporter文档)来定义可以使用单个导入参数导出的常量组.

更新:%EXPORT_TAGS如果您有多个常量,这是一个如何使用该功能的示例.

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;


请解释为什么更好地使用'import'?

2> moritz..:

常量只是具有空原型的子,因此它们可以像任何其他子一样导出.

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



3> Tanktalus..:

为了扩大在前面的答案,因为常量实际上只是替补,你可以直接调用它们:

use Foo;
print Foo::BAR;


不要将答案称为上面的答案,因为如果你的答案得到足够的投票,它可能最终会高于它们.

4> 小智..:

您可能想要考虑使用Readonly而不是常量.


由于'use constant'创建了一个子程序,因此存在意外问题=>没有字符串插值,难以用作散列键.请参阅Readonly的文档[https://metacpan.org/module/Readonly#COMPARISON-WITH-use-constant].只读使用perl内部直接将变量标记为只读.Readonly很慢(除非使用Readonly :: XS)并且没有维护.另请参阅Data :: Lock和Const :: Fast以了解不同的实现.
实际上,您可以在字符串中插入常数。只需使用与其他函数相同的语法即可:`use constant COLOR =>'red'; 打印“颜色为@ {[COLOR]}!”;`

5> maletin..:
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> Schwern..:

要添加到技巧包中,因为常量只是一个子例程,您甚至可以将其称为类方法.

package Foo;
use constant PI => 3.14;

print Foo->PI;

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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有