Как сохранить переменную в области видимости для всех подпрограмм - PullRequest
2 голосов
/ 02 ноября 2010

Я пытаюсь создать модуль, подобный этому

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 ]

4 голосов
/ 02 ноября 2010

Объявите $x в области видимости файла, используя my или our:

my $x;

# subroutines definition

Файл имеет самую большую лексическую область видимости, поэтому переменная будет видна для остальной части кодаесли вы не объявите его повторно в какой-то внутренней области, используя my).

3 голосов
/ 02 ноября 2010

Сделать $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 голосов
/ 02 ноября 2010

Одним из основных преимуществ ОО является инкапсуляция:

#!/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 голосов
/ 02 ноября 2010

см. наш

(комментарии к моему предложению верны, мое предложение не было)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...