Почему переменные объявлены "нашими" видимыми в файлах?

Из "нашего" 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