our
您可以使用关键字声明全局变量:
our $var = 42;
每个全局变量都有一个完全限定的名称,可用于从任何地方访问它。全名是包名加上变量名。如果此时您还没有声明一个包,那么您就在 package 中main
,它可以缩短为一个leading ::
。所以上面的变量有名字
$var # inside package main
$main::var # This is most obvious
$::var # This may be a good compromise
如果我们使用了另一个包,前缀会改变,例如
package Foo;
our $bar = "baz";
# $Foo::bar from anywhere,
# or even $::Foo::bar or $main::Foo::bar
如果我们想使用不带前缀的变量,但是在其他包下,我们必须将其导出。这通常是通过子类化来完成的Exporter
,请参阅@Davids 答案。但是,这只能提供来自正在use
d 的包的变量,而不是相反。例如
Foo.pm
:
package Foo;
use strict; use warnings;
use parent 'Exporter'; # imports and subclasses Exporter
our $var = 42;
our $not_exported = "don't look at me";
our @EXPORT = qw($var); # put stuff here you want to export
# put vars into @EXPORT_OK that will be exported on request
1;
script.pl
:
#!/usr/bin/perl
# this is implicitly package main
use Foo; # imports $var
print "var = $var\n"; # access the variable without prefix
print "$Foo::not_exported\n"; # access non-exported var with full name
词法变量(用 声明my
)没有全局唯一名称,不能在其静态范围之外访问。它们也不能与Exporter
.