2010-11-02 48 views
2

我想创建一个模块,它是这样如何范围变量保留所有子程序

package MyModule; 

use strict; 
use Exporter; 
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); 

$VERSION = 1.00; 
@ISA = qw(Exporter); 
@EXPORT = qw(func1); 

sub func1 {  
    my x = shift;  
    print x;  
    func2();  
} 

sub func2 {  
    print x;  
} 

和Perl脚本,我打电话模块的FUNC1和传递变量x。如何让这个变量对这两个子程序可见或者说出该模块内的所有功能。 请帮忙。

回答

4

中声明的文件的范围$x最大的词法范围,因此该变量对于其余代码将可见(除非您使用my在一些内部范围中重新声明它)。

+0

谢谢,它的工作 – alp 2010-11-02 15:35:20

+0

'我们'是一个有点有趣的事情,它实际上是一个全球变量的词汇别名。 – tchrist 2010-11-02 19:00:31

3

$x词法到 文件,而不是一个单一的子程序:

package MyModule; 

use strict; 
use Exporter; 
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); 

$VERSION = 1.00; 
@ISA = qw(Exporter); 
@EXPORT = qw(func1); 

my $x; 

sub func1 { 

    $x = shift; 
    print $x; 

    func2(); 
} 

sub func2 { 

    print $x; 
} 

但是这个例子并没有真正意义。一个更明智的例子是,以限定的词汇文件句柄,所述包装内的多个子程序打印到:

my $x; 

# subroutines definition 

文件具有:使用myour

package PoorManLogger; 

my $fileHandle; 

sub initialize { open $fileHandle, '<', +shift } 

sub alert { print $fileHandle 'ALERT: ', @_, "\n"; } 

sub debug { print $fileHandle 'DEBUG: ', @_, "\n"; } 

sub close { close $fileHandle; } # Though this isn't technically needed. 

1; 
+0

谢谢,它的工作。 – alp 2010-11-02 15:34:02

+2

词法有文件和块范围。它们与包装无关。 – 2010-11-02 16:09:30

+0

更准确地说,**词法有范围** - 这是一个与包无关的概念 - 范围是一个文件,一个块或一个'eval'字符串。另一种想法是将示波器和模块等同起来,但是你必须在文件和'eval'字符串中加上假想的曲线。 – tchrist 2010-11-02 18:57:51

-1

看到 our

(评论我的建议是正确的,我的建议是不是)

+1

这会创建一个在当前文件范围之外可见的变量,这比OP所要求的更多。 – Ether 2010-11-02 18:05:00

+1

有人可能会质疑,“我们的”实际上是否创建了一个变量,而不仅仅是授予包的视图。但我担心这会变成某种深刻的本体论调查。 ☹ – tchrist 2010-11-02 19:25:02

2

一个OO的主要好处是封装:

#!/usr/bin/perl 

package MyModule; 

use strict; use warnings; 

sub new { 
    my $class = shift; 
    bless { x => shift } => $class; 
} 

sub x { 
    my $self = shift; 
    $self->{x} = shift if @_; 
    return $self->{x}; 
} 

sub func2 { 
    my $self = shift; 
    print $self->x, "\n"; 
} 

package main; 

use strict; use warnings; 

my $m = MyModule->new(5); 

$m->func2; 

$m->x(7); 

$m->func2; 
+0

我只是喜欢同样的子如何是一个getter _and_ setter ... – Zaid 2010-11-02 17:36:30

+0

不会'如果(@_){'比'defined'测试更好,捕获合法地将'undef'分配给'x ' – 2010-11-02 17:45:49

+0

@Eric当然。自从我上次写入访问器以来已经很长时间了。 – 2010-11-02 17:59:12