如何全局声明变量,使其';它对所有perl模块都可见吗?

如何全局声明变量,使其';它对所有perl模块都可见吗?,perl,perl-module,Perl,Perl Module,嗨,我有一个名为main.pl的perl脚本。这个perl脚本正在调用三个perl模块,分别名为sub1.pm,sub2.pm,和sub3.pmsub.pm返回三个哈希值,它们在sub2.pm和sub3.pm中使用。我将散列作为输入参数传递给sub2和sub3。相反,是否有任何方法可以全局声明散列,以便这两个perl模块可以看到散列?在模块XY中声明的每个变量 our $var; our %hash; 或 已声明为全局并可作为 $XY::var %XY::hash; 在其他每个perl模块中

嗨,我有一个名为main.pl的perl脚本。这个perl脚本正在调用三个perl模块,分别名为
sub1.pm
sub2.pm
,和
sub3.pm
sub.pm
返回三个哈希值,它们在
sub2.pm
sub3.pm
中使用。我将散列作为输入参数传递给sub2和sub3。相反,是否有任何方法可以全局声明散列,以便这两个perl模块可以看到散列?

在模块XY中声明的每个变量

our $var;
our %hash;

已声明为全局并可作为

$XY::var
%XY::hash;
在其他每个perl模块中(如果该模块已被使用/需要)


HTH

当您声明非全局变量时,将“我的”放在前面。i、 e:

my$local_变量=4

您要做的是将“my”替换为“our”,并确保它位于子例程之外。i、 e:

我们的$global_变量=4

如果您希望在其他模块中使用它,可以通过以下方式添加它:

使用变量qw($global_variable)


既然我告诉了你怎么做,我就告诉你不要做。强烈反对使用全局变量。只要有可能,就应该使用局部变量。这是因为如果您正在处理一个更大的项目或一个有多个编码人员的项目,那么您可能会发现未知错误,因为某些变量可能不等于您预期的值,因为它们在其他地方发生了更改。

可能,但这几乎肯定是一个XY问题——使用模块的全部目的是隔离名称空间,而您正试图颠覆这一点。退后一步,看看您实际试图实现的功能将散列作为参数分配到
sub2()
sub3()
听起来完全正确。使用全局变量不太可能为您提供更好的工程解决方案。我希望它们实际上被称为
Sub1.pm
Sub2.pm
Sub3.pm
或者更具描述性的名称?小写的包名是为pragmassorry保留的,我是perl的新手。这是什么XY?包名。但是如果您是perl的新手,这就是为什么这是一个坏主意的更多原因;并在subs中将其用作%main::hash1。(或者$main::hash1{key1})不,不是。我们使用包和子例程的全部原因是为了尽可能远离全局变量。随着代码库的增长,使用全局变量不可避免地会导致难以追踪远程bug。使用包和子例程的原因是为了保持名称空间干净,并减少此操作的距离。假设你有10个潜艇,加上第11个。在这里,您更改了变量
$x
,但忘记了
$x
以前在其他地方用于其他用途。现在,有些东西与这段新代码相去甚远,您必须努力找出wtf发生的原因。。。“我不想一直传下去。”
$XY::var
%XY::hash;