Perl的 - 全局变量中包含的所有脚本和模块可用?(Perl - Global variables

2019-09-02 10:48发布

因此,可以说我有一个main.pl脚本,该脚本我需要声明一些变量(任何种类的变量不变或正常)和这些变量需要通过所有脚本和模块,我会包括从可用main.pl脚本自动。

我的意思,如果我有一个变量$myVarmain.plmain.pl我需要script1.plscript2.plscript3.pm ,并从这些脚本的任何人,我需要访问$myVar ,你会访问任何在具体的脚本或模块定义的变种。

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

是不是有像PHP,你会使用关键字global $var1, $var2等从父脚本中使用变量?

任何例如,文件或物品是可以接受的 - 基本上任何可以帮助我实现这个目标将是有益的。

Answer 1:

你可以声明与全局变量our关键字:

our $var = 42;

每个全局变量可以用来从任何地方访问它一个完全合格的名称。 全名是名,加上变量名。 如果你还没有宣布一个包在这一点上,你在包装main ,可以缩短到领先:: 。 因此,上述变量的名字

$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



Answer 2:

要做到这一点最简单的方法,是创建自己的模块。 因此,举例来说,如果我想给变量全球访问$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


文章来源: Perl - Global variables available in all included scripts and modules?