2010-11-10 106 views
0

有什么区别(如果有的话)我的包“测试::测试”的这两种封装版本的用户:包变量声明问题

Test::Test; 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw(hello); 
use strict; use warnings; 

our $c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

Test::Test; 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw(hello); 

$c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

回答

4

总是启用strictwarnings是个好习惯。这些编译指南可以帮助您捕捉许多简单的错误和拼写错误。

这两个样本是等效的。但第一个是首选,因为它明确声明全局变量$c使用our并启用约束和警告。

1

perl中的变量缺省为全局变量,无论它们是否在模块中声明。 “我的”,“本地”和“我们的”关键字以不同的方式来限定变量。在你的例子中,“我们的$ c”限制了变量对包的可见性(除非你选择导出它,但那是另一回事)。

因此,对于您的后一个示例,访问和修改$ c的任何其他代码段也会影响您的代码。

请参阅http://perldoc.perl.org/functions/our.html了解有关“我们的”关键字的官方文档。

+6

这并不准确。 '$ c'是包含或不包含'our'的全局包('$ Test :: Test :: c'),任何包或不包含的包都可以通过该名称访问它。然而,启用'strict'vars''后,即使在'Test :: Test'中也不能调用它'$ c',除非使用'use vars'来创建一个异常,或者使用'our'创建一个词法别名。 “我的”和“本地”当然做了完全不同的事情。 – hobbs 2010-11-10 07:48:33

+3

另请参阅http://stackoverflow.com/questions/3626190/why-are-variables-declared-with-our-visible-across-files/3626333#3626333以进一步解释“我们”做了什么,它有什么不同来自'use vars',以及它为什么不仅仅意味着“在这个包中可见”。 – hobbs 2010-11-10 07:49:55

+0

对,它是“严格使用”和“我们”的重要组合。严格使用程序员声明变量并考虑范围。 – 2010-11-10 08:10:40

3

FWIW,写这个模块正确的方法是这样的:

package Test::Test; 
use strict; 
use warnings; 

use Exporter 'import'; # gives you the import method directly 
our @EXPORT = qw(hello); 

my $c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

perldoc Exporter最佳实践写作模块,产品出口,对各种情况。

我还建议改变这个包的名字,因为Test :: namespace已被核心模块和CPAN发行版使用。