Почему переменные объявлены "нашими" видимыми в файлах?
Из "нашего" perldoc:
у нас есть те же правила определения области, что и у меня, но не обязательно создается переменная.
Это означает, что переменные, объявленные с помощью our
, не должны отображаться в файлах, потому что файл является наибольшей лексической областью. Но это не так. Почему?
Ответы
Ответ 1
Вы можете рассмотреть our
, чтобы создать псевдоним с лексической областью для глобальной переменной пакета. Доступны глобальные глобальные пакеты; что делает их глобальными. Но имя, созданное our
, видимо только в лексической области объявления our
.
package A;
use strict;
{
our $var; # $var is now a legal name for $A::var
$var = 42; # LEGAL
}
say $var; # ILLEGAL: "global symbol $var requires explicit package name"
say $A::var; # LEGAL (always)
{
our $var; # This is the same $var as before, back in scope
$var *= 2; # LEGAL
say $var; # 84
}
Ответ 2
У вас уже есть хороший ответ, но, возможно, это тоже будет полезно.
Объявление our
объединяет аспекты my
и use vars
. Он функционирует аналогично use vars
тем, что объявляет переменные пакета; однако переменные, объявленные таким образом, лексически ограничены и не могут быть доступны за пределами области, в которой они были объявлены (если вы не используете полное имя переменной). Кроме того, переменная, объявленная с помощью our
, видна во всей ее лексической области, даже на границах пакета.
Здесь таблица, которую я добавил в свой Perl, немного напоминает. Например, см. этот ответ SO.
Scope/ Package
Namespace Variable Private New
---------------------------------------------------
my Lexical No Yes Yes
our Lexical Yes No No
use vars Package Yes No No