Локальные и глобальные переменные в Perl

у меня мало сомнений для local/our область в perl. Я прочитал много документации, но все еще есть путаница. Ниже приведены путаницы

  1. что это local объем?

    то, что я читаю, - > local копирует значение глобальной переменной, изменяет значение, пользователь будет использовать его, и вне блока он сохранит глобальное значение

    растерянность -> my делает то же самое. Единственное преимущество я вижу, что некоторые переменные, такие как $package::var не может быть объявлен с моей областью, но может быть объявлен с локальной областью. Что еще для местных

  2. что такое" глобальная " переменная?

то, что читается - > его область находится в пакете. В основном мы помещаем глобальную переменную в @EXPORT массив и использовать его или добавить пространства имен для использования в других пакетах.

сомнение -> снова если мы объявляем переменную с my объем в основном только тогда мы можем получить доступ к переменной по всей пакет. Это правда? Можно ли добавить my переменные в @EXPORT массив и использовать его в других пакетах?

Я думаю, что глобальные переменные объявляются с our ключевое слово. Есть ли другой способ сделать это?

этот вопрос может выглядеть как повторяющийся, но я смущен

3 ответов


С точки зрения области видимости в Perl есть два вида переменных.

  • лексические переменные, область видимости, что означает, что они видны только в текущей лексической области.
  • переменные пакета глобально ограничены, что означает, что они видны всем кодом в интерпретаторе.

вот способы создания переменной.

  • my создает лексическую переменную.
  • our создает лексическая переменная, которая имеет псевдоним переменной с тем же именем в текущем пакете. Другими словами,our $foo; это то же самое, что alias my $foo = $The::Current::Package::foo;.
  • глобальные переменные создаются при использовании.

local не создает никаких переменных. Он просто создает резервную копию переменной, пока текущая лексическая область не будет уничтожена.


my делает то же самое.

нет. local не изменяет область действия переменной. В то время как лексическая переменная видна только в лексической области, локализованная глобальная переменная все еще видна во всем интерпретаторе.

$x = 123;
sub foo { print "$x\n"; }
{ local $x = 456; foo(); }  # 456
foo();                      # 123

$x = 123;
sub foo { print "$x\n"; }
{ my $x = 456; foo(); }   # 123
foo();                    # 123

что еще для local

local в первую очередь используется для приближения функциональности my для переменных, которые иначе не могут быть объявлены лексически.

(исторически это были все переменные. Начиная с 5.6, только переменные знаки препинания не быть объявленным лексически.)


что такое" глобальная " переменная?

переменная, которая может рассматриваться глобально, т. е. любым кодом в интерпретаторе.


можно ли добавить переменные моей области в массив @EXPORT и использовать его в других пакетах?

нет. @EXPORT используется экспортером. Экспортер не сможет найти ничего, кроме глобальных символов (поскольку файлы компилируются в свежей лексике scopes), so @EXPORT должен содержать только глобальные символы.


существует два вида переменных, лексически ограниченных и глобально ограниченных.

в Perl до версии 5 была только глобальная область. Эти переменные являются переменными пакета. Эти переменные доступны везде в программе, если вы используете префикс пакета.

на local ключевое слово было введено, чтобы предоставить способ изменить значение одной из этих глобальных переменных пакета внутри ограниченной области, например внутри одной подпрограммы. Это спасет старых. значение в стеке при входе в область с помощью local оператор, и при выходе он восстановит старое значение. Это все еще глобалы пакетов, что означает, что они по-прежнему доступны везде. Если вы находитесь внутри области с local переменная, и вы вызываете подпрограмму, эта переменная все еще видна внутри этой подпрограммы.

на my ключевое слово было введено в версии 5 и предоставляет лексически ограниченные переменные. Эти переменные существуют только внутри области где они объявлены. Это означает, что если вы вызываете подпрограмму,my переменная не видна. При выходе из области видимости my переменные просто уйти. Вы должны предпочесть использовать my переменные, когда это возможно, потому что вы не хотите, чтобы ваши переменные были видны внутри подпрограмм, которые вы вызываете. Вы не можете использовать эти типы переменных в @EXPORT список, потому что эти переменные не видны за пределами своей области.

наконец,our ключевое слово-это комбинация обоих, в том, что она дает вам переменную, которая является глобальным пакетом, но эта переменная лексически ограничена. Это означает, что он будет доступен в любом месте программы, но в конце заключительного блока вы больше не можете ссылаться на эту переменную.


Пример 1:

sub mess_with_foo {
      $foo=0;
 }

 sub myfunc {
      my $foo=20;
      mess_with_foo();
      print $foo;
 }
 myfunc();

Пример 2:

 sub mess_with_foo {
      $foo=0;
 }

 sub myfunc {
      local $foo=20;
      mess_with_foo();
      print $foo;
 }
 myfunc();

Пример 1 печать 20, потому что mess_with_foo() не видел my $foo. Это не могло изменить его. my $foo можно увидеть только в область myfunc().

Пример 2 печать 0, потому что mess_with_foo() видим my $foo и изменить его. local $foo видно, в область myfunc() и в области любой функции, вызываемой из ее области myfunc().

это единственная разница. Ни my $foo, ни local $foo будет видно за пределами их области myfunc().