Почему я не получаю правильную переменную пакета при использовании нашего ()? - PullRequest
0 голосов
/ 31 августа 2009

Приведенная ниже программа печатает «var = 13» и «var = 13». Разве это не должно печатать "var = 3" и "var = 13"?

use warnings;
use strict;

package p1;
our $var = 3;

package p2;
our $var = 13;
sub temp
{
    package p2;
    print "var = $var\n";
}

package p1;
print "var = $var\n"; #This prints var = 13. Why is it picking p2::var as the current package is p1?

&p2::temp;

1 Ответ

12 голосов
/ 31 августа 2009

из первого абзаца 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...