[Perl] Ламерский вопрос про require и our

Geddi-S

Есть конфигурационный файл ./include/cfg.pl:

our $tmp = "vasya";

Подключаю его с помощью require в основном файле main.pl:

use FindBin qw($Bin);
use lib "$Bin/include";
require "cfg.pl";

Теперь я могу использовать переменную $tmp в main.pl без какого-то ни было объявления. Правильно ли это?
Просто встречал варианты, когда в главном файле дополнительно объявляют переменную с этим же именем с помощью our (или use vars).
Как вообще правильно поступать в таких случаях? И почему в cfg.pl нельзя писать my $tmp? Это из-за того, что require помещает содержимое cfg.pl в отдельный блок?
Заранее спасибо.

eduard615

> Теперь я могу использовать переменную $tmp в main.pl без какого-то ни было объявления. Правильно ли это?
неправильно. perldoc strict
> Просто встречал варианты, когда в главном файле дополнительно объявляют переменную с этим же именем с помощью our (или use vars).
это более правильно, но, имхо, не кошерно.
our — это ассоциация имени переменной с текущем пакетом. в данном случае our не будем выделять для нее память, в отличии от my
> И почему в cfg.pl нельзя писать my $tmp? Это из-за того, что require помещает содержимое cfg.pl в отдельный блок?
да. require аналогично eval (если выкинуть всякие проверки на двойное включение). perldoc -f require, там расписано require в виде кода.
> Как вообще правильно поступать в таких случаях?
perldoc perlmod в районе @EXPORT и perldoc vars.
особые эстеты переопределяют import.

Geddi-S

неправильно. perldoc strict
да, точно, спасибо.
да. require аналогично eval (если выкинуть всякие проверки на двойное включение). perldoc -f require, там расписано require в виде кода.
ага, я смотрел этот пример, там такого рода импликация require->do->eval. На всякий случай поинтересовался об eval
perldoc perlmod в районе @EXPORT и perldoc vars.
это посмотрю, хотя многое урывками уже видел. Еще где-то прочитал, что сейчас предпочтительнее использовать our вместо use vars.
Спасибо!
P.S. А не подскажете, где прочитать о local, my, our в компактном виде?

eduard615

> Еще где-то прочитал, что сейчас предпочтительнее использовать our вместо use vars.
Не совсем, там есть различия

johnny:> cat 2.pl
#!/usr/bin/perl
#
package foo;
use vars qw/$x/;
$x = 1;
our $y = 2;

package bar;
print "$x\n";
print "$y\n";
johnny:> ./2.pl

2
johnny:>

> P.S. А не подскажете, где прочитать о local, my, our в компактном виде?
программинг перл с верблюдом

Geddi-S

Спасибо за помощь!
Буду разбираться.
Оставить комментарий
Имя или ник:
Комментарий: