我试图了解 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/