Локальные и глобальные переменные в Perl
у меня мало сомнений для local/our
область в perl. Я прочитал много документации, но все еще есть путаница. Ниже приведены путаницы
-
что это
local
объем?то, что я читаю, - > local копирует значение глобальной переменной, изменяет значение, пользователь будет использовать его, и вне блока он сохранит глобальное значение
растерянность ->
my
делает то же самое. Единственное преимущество я вижу, что некоторые переменные, такие как$package::var
не может быть объявлен с моей областью, но может быть объявлен с локальной областью. Что еще для местных что такое" глобальная " переменная?
то, что читается - > его область находится в пакете. В основном мы помещаем глобальную переменную в @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()
.