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

前端之家收集整理的这篇文章主要介绍了为什么Perl不会在另一个名称空间中使用未声明的变量时发出警告 – 我怎么能被警告呢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我使用未声明的变量,我在Perl脚本中使用strict和warning来通知我.因此,解释器将在以下scriptlet中警告$foo未声明:

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

$foo = 'bar';
print ($foo);

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

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

$BAR::foo = 'bar';
print ($BAR::foo);

为什么会有这种差异?

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

解决方法

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

strict vars

This generates a compile-time error if you access a variable that was neither explicitly declared (using any of my,our,state,or use vars) nor fully qualified.

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

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

猜你在找的Perl相关文章