我正在用Perl编写一个带有几个模块的应用程序.我想写一些从任何地方都可以看到的全局常量,如下所示:
#Constants.pm $h0 = 0; $scale = 20;
然后使用它们而无需使用main::
或Constants::
在几个模块中进行限定.但是,如果我use Constants;
在多个模块中编写,它们只会导入到一个名称空间中.有没有办法解决?
我正在使用最新的ActivePerl.
查看Exporter和perlmod
手册页.
这段代码应该完全符合您的要求.将所有荣誉发送给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__."::"};
}
不要告诉任何我告诉过你的人,但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
等)
但是,如果你在实际代码中执行此操作,那么期望有人谋杀你:)不过,最好知道,以防万一你看到其他人这样做.