【问题标题】:How to declare a variable globally so that it's visible for all perl modules?如何全局声明一个变量,以便它对所有 perl 模块可见?
【发布时间】:2016-01-29 10:48:53
【问题描述】:

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

【问题讨论】:

  • 可能,但这几乎可以肯定是一个 XY 问题 - 使用模块的全部意义在于隔离命名空间,而您正试图颠覆它。退后一步,看看你真正想要完成的事情
  • 将哈希值作为参数传递给sub2()sub3() 听起来完全正确。使用全局变量不太可能为您提供设计更好的解决方案。
  • 我希望它们实际上被称为Sub1.pmSub2.pmSub3.pm 或者更详细的描述?小写包名保留给 pragmas

标签: perl perl-module


【解决方案1】:

当你声明非全局变量时,它是通过在它前面加上“my”来完成的。即:

my $local_variable = 4;

您想要做的是将“my”替换为“our”,并确保将其放在子例程之外。即:

our $global_variable = 4;

如果你想在其他模块中使用,可以通过以下方式添加:

use vars qw($global_variable);

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

【讨论】:

    【解决方案2】:

    您在模块 XY 中声明的每个变量都使用

    our $var;
    our %hash;
    

    use vars qw($var %hash);
    

    被声明为全局的并且可以作为

    $XY::var
    %XY::hash;
    

    在每个其他 perl 模块中(如果该模块已被使用/需要)。

    HTH

    【讨论】:

    • 对不起,我是 perl 的新手。这是什么 XY?
    • 包名。但是,如果您是 perl 的新手,那就更有理由认为这是一个坏主意。
    • 因此,如果您在调用脚本 %hash1 中有全局变量(隐含的是主包),您将使用我们的 %hash1; 声明它并将其用作潜艇中的 %main::hash1 。 (或 $main::hash1{key1} ......)
    • 不,不是。我们使用包和子程序的全部原因是尽可能远离全局变量。随着代码库的增长,使用全局变量不可避免地会导致难以追踪远程错误。使用包和子例程的原因是为了保持命名空间干净,并减少这种远距离操作。想象一下,你有 10 个潜艇,你添加了第 11 个。在那里,您更改了变量$x,但您忘记了$x 以前在其他地方用于其他用途。现在有些东西与这个新代码相去甚远,你必须努力弄清楚发生了 wtf。
    • 引用c2.com/cgi/wiki?GlobalVariablesAreBad 使用全局变量的真正糟糕的理由:...“我不想一直传递它。”
    猜你喜欢
    • 2020-11-09
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多