В 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.
}