如何将变量保持在所有子例程的范围内

时间:2010-11-02 15:23:17

标签: perl

我正在尝试创建一个类似这样的模块

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 个答案:

答案 0 :(得分:4)

使用$xmy在文件范围内声明our

my $x;

# subroutines definition

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

答案 1 :(得分: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;
}

但这个例子并没有多大意义。一个更明智的例子是定义一个词法文件句柄,包中的多个子程序打印到:

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;

答案 2 :(得分: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;

答案 3 :(得分:-1)

our

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