Каково различие между 'мой' и 'наш' в Perl?

Я знаю что my находится в Perl. Это определяет переменную, которая существует только в пределах блока, в котором это определяется. Что делает our ?

Как делает our отличайтесь от my?

184
задан Peter Mortensen 20 November 2019 в 03:07
поделиться

6 ответов

Отличный вопрос: Чем наш отличается от мой и чем наш делает?

Резюме:

Доступный с Perl 5, my - это способ объявления:

  • переменных, не относящихся к пакету, которые являются
  • закрытыми,
  • новыми ,
  • неглобальными переменные
  • отдельно от любого пакета. Таким образом, переменная не может быть доступна в форме $ package_name :: variable .


С другой стороны, наши переменные:

  • пакетные переменные и, таким образом, автоматически
  • глобальные переменные,
  • определенно не частные ,
  • и не обязательно новые; и к ним
  • можно получить доступ вне пакета (или лексической области видимости) с помощью квалифицированное пространство имен, как $ package_name :: variable .


Объявление переменной с помощью наш позволяет вам предварительно объявить переменные, чтобы использовать их в , используйте strict без получение предупреждений об опечатках или ошибок времени компиляции. Начиная с Perl 5.6, он заменил устаревшие use vars , которые имели только файловую область видимости, а не лексическую, как наш .

Например, формальное квалифицированное имя для переменной $ x внутри пакета main используется значение $ main :: x . Объявление нашего $ x позволяет вам использовать голую переменную $ x без штрафа (т. Е. Без результирующей ошибки) в области объявления, когда сценарий использует используйте strict или используйте strict "vars" . Объем может быть один, два или несколько пакетов,

213
ответ дан 23 November 2019 в 05:57
поделиться

Ссылки на PerlMonks и PerlDoc от cartman и Olafur являются отличным справочником - ниже моя трещина в резюме:

мои переменные лексически ограничены в пределах одного блока, определенного {} или в том же файле, если не в {} s , Они недоступны из пакетов / подпрограмм, определенных вне той же лексической области / блока.

60
ответ дан 23 November 2019 в 05:57
поделиться

my используется для локальных переменных, тогда как наш используется для глобальных переменных.

Подробнее читайте в Variable Scoping in Perl: the основы .

6
ответ дан 23 November 2019 в 05:57
поделиться

perldoc имеет хорошее определение нашего.

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

4
ответ дан 23 November 2019 в 05:57
поделиться

Coping with Scoping is a good overview of Perl scoping rules. It's old enough that our is not discussed in the body of the text. It is addressed in the Notes section at the end.

The article talks about package variables and dynamic scope and how that differs from lexical variables and lexical scope.

12
ответ дан 23 November 2019 в 05:57
поделиться

An example:

use strict;

for (1 .. 2){
    # Both variables are lexically scoped to the block.
    our ($o);  # Belongs to 'main' package.
    my  ($m);  # Does not belong to a package.

    # The variables differ with respect to newness.
    $o ++;
    $m ++;
    print __PACKAGE__, " >> o=$o m=$m\n";  # $m is always 1.

    # The package has changed, but we still have direct,
    # unqualified access to both variables, because the
    # lexical scope has not changed.
    package Fubb;
    print __PACKAGE__, " >> o=$o m=$m\n";
}

# The our() and my() variables differ with respect to privacy.
# We can still access the variable declared with our(), provided
# that we fully qualify its name, but the variable declared
# with my() is unavailable.
print __PACKAGE__, " >> main::o=$main::o\n";  # 2
print __PACKAGE__, " >> main::m=$main::m\n";  # Undefined.

# Attempts to access the variables directly won't compile.
# print __PACKAGE__, " >> o=$o\n";
# print __PACKAGE__, " >> m=$m\n";

# Variables declared with use vars() are like those declared
# with our(): belong to a package; not private; and not new.
# However, their scoping is package-based rather than lexical.
for (1 .. 9){
    use vars qw($uv);
    $uv ++;
}

# Even though we are outside the lexical scope where the
# use vars() variable was declared, we have direct access
# because the package has not changed.
print __PACKAGE__, " >> uv=$uv\n";

# And we can access it from another package.
package Bubb;
print __PACKAGE__, " >> main::uv=$main::uv\n";
48
ответ дан 23 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: