из первого абзаца perldoc -f our
:
our
связывает простое имя с переменной пакета в текущем пакете для использования в текущей области. Когда использование strict 'vars'
вступает в силу, наш позволяет вам использовать объявленный глобальный
переменные, не определяя их именами пакетов, в лексической области объявления our
. В этом наше отличие отличается от use vars
, который является областью действия пакета.
Ваш первый our
создает псевдоним $p1::var
с именем $var
в текущей области. Эта область действия работает до конца файла (операторы package
не создают новую область). Но затем вы создаете новый псевдоним для $var
($p2::var
). Таким образом, этот псевдоним сохраняется до конца области (то есть файла) или до следующего переопределения псевдонима.
Если вы хотите ограничить область действия our
, создайте новую область:
#!/use/bin/perl
package p1;
use strict;
use warnings;
our $var = 3;
{
package p2;
use strict;
use warnings;
our $var = 13;
}
print "$var in package ", __PACKAGE__, "\n";
{
package p2;
use strict;
use warnings;
our $var;
print "$var in package ", __PACKAGE__, "\n";
}
print "$var in package ", __PACKAGE__, "\n";