为什么严格抱怨所需的其他脚本中的变量?

时间:2012-04-12 17:53:46

标签: perl require perl-module strict

这是usex.pl:

#use strict;
require 'x.pl';
print $x;

这是x.pl:

#use strict;
our $x = 99;
1;

如图所示运行正常。如果我取消注释usex.pl中使用strict的行,我得到

Global symbol "$x" requires explicit package name

在x.pl中使用或不使用strict似乎并不重要(除非我删除'our'关键字,但我对此不感兴趣。)

我是Perl的新手。为什么严格使$ x在主脚本中不可见,这是什么原因?

2 个答案:

答案 0 :(得分:7)

有两个原因。

  1. 错误发生在编译时,在require执行之前。使用BEGIN很容易解决。

  2. our是词法范围的,它与print的词法范围(文件或块)不同,所以它不再有效。

  3. 整个方法从根本上说是糟糕的。这是一个更好的方法:

    package MyConfig;
    use strict;
    use warnings;
    use Exporter qw( import );
    our @EXPORT = qw( $x );
    our $x = 123;
    1;
    
    use strict;
    use warnings;
    use MyConfig;
    print "$x\n";
    

答案 1 :(得分:5)

Hehe,our并不容易,因为它混合了全局和词汇范围的概念。它的作用是从strict 'vars' pragma中豁免全局变量,并允许在其范围内对其进行非限定访问,这是封闭块,或当前文件的结尾,无论先发生什么。 Read the full (but brief) story in the manual,也可以通过在命令行上说perldoc -f our来访问。

对于您的脚本,您可以通过修改变量访问器以使用包限定名称来验证手册中单词的真实性:

use strict;
require 'x.pl';
print $main::x;