17

因此,假设我有一个main.pl脚本,并且在该脚本中我需要声明一些变量(任何类型的变量常量或普通变量),并且这些变量需要可通过我将main.pl自动从该脚本中包含的所有脚本和模块获得。

我的意思是,如果我$myVar在我需要、或、main.pl以及我需要访问的任何脚本中都有一个变量,就像您访问在该特定脚本或模块中定义的任何 var 一样。main.plscript1.plscript2.plscript3.pm$myVar

我在网上搜索过,但我只找到了可以从包含的脚本中访问变量或从模块中提取变量的示例;但这不是我想要的。

没有像 PHP 这样的关键字,您可以在其中使用global $var1, $var2etc. 来使用父脚本中的变量吗?

任何示例、文档或文章都是可以接受的——基本上任何可以帮助我完成的东西都会有所帮助。

4

2 回答 2

38

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 答案。但是,这只能提供来自正在used 的包的变量,而不是相反。例如

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.

于 2013-05-09T23:09:08.017 回答
5

最简单的方法是创建自己的模块。因此,例如,如果我想全局访问 variables $foo and $bar,那么我可以创建一个模块,如下所示:

# file:  MyVars.pm
package MyVars;

$foo = 12;
$bar = 117.8;

1;

然后我可以使用任何使用 MyVars 模块的 perl 脚本来访问这些变量:

# file:  printvars.pl
use MyVars;

print "foo = $MyVars::foo\nbar = $MyVars::bar\n";

输出:

foo = 12
bar = 117.8
于 2013-05-09T22:47:14.670 回答