В Perl, как разделить переменную между подпрограммами, с использованием строгого?

Если я не use strict; следующий код работает нормально и печатает "Алиса":

assign_name();
print_name();

sub assign_name {
    $name = "alice";
}

sub print_name {
    print $name;
}

Однако, когда я делаю use strict; тогда я знаю, что мне придется объявить переменную перед ее использованием. Я читаю где-то, я должен использовать our вместо my объявить глобальную переменную. Итак, у меня было следующее:

use strict;
use warnings;

assign_name();
print_name();

sub assign_name {
    our $name = "alice";
}

sub print_name {
    print $name;   # This is line 12.

}

И тогда я получаю следующую ошибку:

Variable "$name" is not imported at test.pl line 12.
Global symbol "$name" requires explicit package name at test.pl line 12.
Execution of test.pl aborted due to compilation errors.

Пожалуйста помоги.

3 ответа

Решение

Просто объявите переменную, где оба сабвуфера могут ее видеть.

use strict;
use warnings;

my $name;

assign_name();
print_name();

sub assign_name {
    $name = "alice";
}

sub print_name {
    print $name;
}

(Нет причин использовать our Вот!)

Я знаю, что это выходит за рамки вашего вопроса, и ответ Икегами на него хорошо отвечает, но я думаю, что это еще не все. Если у вас есть функции, предназначенные для изменения переменных в области пакета, скорее всего, вам лучше переписать эти переменные в качестве атрибутов объекта. В Perl мы можем сделать это используя Moose,

#!/usr/bin/env perl

use strict;
use warnings;

{ # proper use of scoping, h/t tchrist

  package Person;

  use Moose;
  use namespace::autoclean; # recommended

  has 'name' => ( is => 'rw', isa => 'Str', required => 1);

  __PACKAGE__->meta->make_immutable; # recommended

}

my $person = Person->new( name => 'Joel' );
$person->name( 'Adam' ); # change name

print $person->name . "\n";

В этом примере мы делаем name атрибут, мы можем установить его во время создания объекта, затем изменить его или просмотреть с помощью методов доступа. Данные, которые были бы глобальными, в данном случае это имя, содержатся во внутренних данных объекта. Это позволяет различным частям вашего кода повторно использовать одну и ту же логику, не беспокоясь о состоянии этих глобальных данных.

Вы должны объявить глобальную переменную upper:

use strict;
use warnings;

my $name;

assign_name();
print_name();

sub assign_name {
    $name = "alice";
}

sub print_name {
    print $name;   # This is line 12.
}
Другие вопросы по тегам