perl - 在perl中声明全局变量

标签 perl global-variables perl-module

我试图了解 use vars ($var); 的工作原理。我意识到,如果我想全局声明一个变量,我可以使用 use vars ($var); 或 Perl 5.6 及更高版本我可以使用 our $var;

但是,我仍然只是想了解它是如何工作的。正在查看the source ,看起来您只需将变量声明为 typeglob 并将其设置为等于其自身的引用版本。什么!?

# My_Module.pm

use strict (vars, subs);
use CGI::Carp;

*My_Module::My_Global = \$My_Module::My_Global;

sub my_function {

  $My_Global = 'Am I declared?';

}

现在这不起作用,我显然收到“ undefined symbol ”错误。那么 use vars 是如何做到的呢?

----------------更新--------------

我完全复制了你的代码,用 use X; 而不是 shell 从 test.cgi 运行它...

X.pm

use strict;
BEGIN { package X; no strict qw( refs ); *main::x = \${"main::x"}; }
print "Content-type: text/html\n\n"; # I added this line since not printing to shell
$x = 123; say $x;
1; 

测试.cgi

#!/usr/bin/perl
use strict;
use X;

...我遇到了与之前相同的编译错误:

Global symbol "$x" requires explicit package name at X.pm line 4.

这只能在 shell 中工作,而不能在模块中工作吗?

最佳答案

将引用分配给 typeglob 是一种特殊的分配;它仅用引用替换引用类型的 typeglob 部分。此外,vars 使用符号引用作为变量名称,而您则没有。 use vars 也在不同的包中执行,并且是在编译时而不是运行时执行。内联等效项是:

BEGIN { package foo; *My_Module::My_Global = \${"My_Module::My_Global"} }

也就是说,使用全局变量通常是一个坏主意。使用不再受支持的 Perl 版本同样是一个坏主意。

关于perl - 在perl中声明全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20620870/

相关文章:

perl - 加载特定版本的 perl 模块

perl - 如何在 lib Path 中使用变量?

perl - 为什么我从 Perl 收到 "Day too big"错误?

python - 如何在 perl 或 python 中搜索文件中某个范围内的所有位置?

linux - 如何抑制从已加载模块代码中发出的 Perl 警告?

c++ - 全局变量笑话

c - Pthreads 在执行时更新全局 2D 数组段错误

JavaScript 全局变量问题

perl - 我应该如何使用 Perl 模块分发数据文件?

perl - 当我模块化代码时开始发生 "Not an ARRAY reference"错误