Почему переменные, объявленные с «нашим» видимым в файлах? - PullRequest
10 голосов
/ 02 сентября 2010

Из "нашего" perldoc :

our имеет те же правила области действия, что и my, но не обязательно создает переменную.

Это означает, что переменные, объявленные с our, не должны быть видны в файлах, так как файл является самой большой лексической областью действия.Но это не так.Почему?

Ответы [ 2 ]

14 голосов
/ 02 сентября 2010

Можно рассмотреть 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
}
7 голосов
/ 02 сентября 2010

У вас уже есть хороший ответ, но, возможно, это тоже будет полезно.

Декларация 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
...