为什么Perl不会在另一个命名空间中使用未声明的变量时发出警告 - 我怎么能被警告呢?

Ren*_*ger 3 variables perl warnings

如果我使用未声明的变量,我正在使用strictwarning在我的Perl脚本中通知我.因此,解释器将$foo在以下scriptlet中警告未声明:

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

$foo = 'bar';
print ($foo);
Run Code Online (Sandbox Code Playgroud)

但是,如果我在另一个命名空间中使用未声明的变量,我不会被警告.以下scriptlet在没有任何警告的情况下运行.

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

$BAR::foo = 'bar';
print ($BAR::foo);
Run Code Online (Sandbox Code Playgroud)

为什么会有这种差异?

由于我已经失去了相当多的时间来确定这个问题,尽管在更大的背景下,我想知道是否有可能让Perl警告在其他命名空间中使用未声明的变量.

Sin*_*nür 9

当您完全指定变量所属的命名空间时,perl假设您知道自己在做什么.见perldoc strict:

strict vars

如果你访问了既没有明确声明的变量(使用任何这将产生一个编译时错误my,our,state,或use vars)也不是完全合格的.

我认为没有办法检测到你指定了一个不存在的变量$BAR::foo.但是,如果BAR包在您的控制之下,您可以通过调解对foo使用访问器的状态的访问权限以及从其他模块隐藏变量来避免首先使用包变量.

使用全局变量创建的问题的答案不是使用全局变量.