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

如何在Perl中将常量导入多个模块?

如何解决《如何在Perl中将常量导入多个模块?》经验,为你挑选了3个好方法。

我正在用Perl编写一个带有几个模块的应用程序.我想写一些从任何地方都可以看到的全局常量,如下所示:

#Constants.pm
$h0 = 0;
$scale = 20;

然后使用它们而无需使用main::Constants::在几个模块中进行限定.但是,如果我use Constants;在多个模块中编写,它们只会导入到一个名称空间中.有没有办法解决?

我正在使用最新的ActivePerl.



1> Joe Casadont..:

查看Exporter和perlmod手册页.



2> Michal Ingel..:

这段代码应该完全符合您的要求.将所有荣誉发送给lkundrak.

package Constants;

use base qw/Exporter/;

use constant BOB => 666;
use constant ALICE => 555;

sub import {
    no strict "refs";

    ${[caller]->[0].'::'}{$_} = ${__PACKAGE__."::"}{$_}
        foreach grep { not /^(ISA|isa|BEGIN|import|Dumper)$/ } 
            keys %{__PACKAGE__."::"};
}



3> jrockway..:

不要告诉任何我告诉过你的人,但Perl的特殊变量随处可见.您可能已经注意到这不起作用:

{ package Foo;
our $global = 42; }

{ package Bar;
say "global is $global"; }

那是因为$global实际上被称为$Foo::global.你也可能注意到,这个"规则"并不适用于像的东西 @INC,%ENV,$_等等.这是因为这些变量总是假定为main.

但实际上,它不仅仅是那些变量.整个glob被"强制"进入main.这意味着你可以这样写:

{ package Constants;
  $_{PI} = 3.141592; }

{ package Foo;
  say "pi is $_{PI}"; }

它会起作用.

(这同样适用于$ENV,&INC等)

但是,如果你在实际代码中执行此操作,那么期望有人谋杀你:)不过,最好知道,以防万一你看到其他人这样做.

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