Как мне использовать ключевое слово «мой» в Perl?


93

Я все время вижу ключевое слово «my» перед именами переменных в примерах сценариев Perl в Интернете, но я понятия не имею, что это означает. Я пробовал читать справочные страницы и другие сайты в Интернете, но мне трудно понять, для чего это нужно, учитывая разницу между тем, как я вижу его использование, и руководством.

Например, он используется для получения длины массива в этом посте: Найти размер массива в Perl

Но в инструкции сказано:

My объявляет перечисленные переменные локальными (лексически) по отношению к включающему блоку, файлу или eval. Если указано более одного значения, список должен быть заключен в круглые скобки.

Что он делает и как его используют?


3
Re "он используется для получения длины массива в этом посте", Вовсе нет. myникак не повлиял на это. Это скалярный оператор присваивания ( =), который применяет скалярный контекст @arr.
ikegami

Если это не совсем "твое", не используйте его.
icenac

Ответы:


145

myограничивает область действия переменной. Область видимости переменной - это то, где ее можно увидеть. Уменьшение области видимости переменной до того места, где она необходима, является фундаментальным аспектом хорошего программирования. Это делает код более читаемым и менее подверженным ошибкам, а также дает множество преимуществ.

Если вы не объявите переменную using my, вместо нее будет создана глобальная переменная. Этого следует избегать. Использование use strict;сообщает Perl, что вы не хотите неявно создавать глобальные переменные, поэтому вы всегда должны использовать use strict;use warnings;) в своих программах.


Связанное чтение: Зачем использовать use strict;и use warnings;?


12
Наконец, ответ, объясняющий почему .
ThisSuitIsBlackNot 02

Для людей , приезжающих сюда из JS: Это , по существу , как varи letв JavaScript. Без 'use strict';JS вы сможете объявлять новые глобальные переменные без какого-либо ключевого слова, что не считается лучшим методом.
Electric Coffee

@Electric Coffee. В терминах JS вопрос звучал бы так: «Что делает letи varделает и как их использовать?» И да, ответ будет примерно таким же. ( letВары JS очень похожи на myвары Perl , за исключением того, что letвары не могут быть захвачены.)
ikegami

Я просто имел в виду, что если бы люди пришли к Perl из JS, это был бы простой способ объяснить ту же концепцию
Electric Coffee

@ElectricCoffee 1) Программист, который понимает область видимости, не нуждается в объяснении этого снова после переключения языков. 2) Не уверен, что вы действительно объяснили область видимости в терминах, понятных программисту JS, или иначе. Может вы пытались объяснить use strict;? Но вопрос был не в этом, и дело use strict;не в этом. Или, может быть, вы хотели сообщить, что myограничивает объем vars вроде как letи varделает, но это в значительной степени первое предложение ответа. 3) Если вы хотите ответить на вопрос по-другому, для этого нужны ответы.
ikegami

28

Краткое резюме: myсоздает новую переменную, localвременно изменяет значение переменной

В приведенном ниже примере $ :: a относится к $ a в «глобальном» пространстве имен.

$a = 3.14159;
{
  my $a = 3;
  print "In block, \$a = $a\n";
  print "In block, \$::a = $::a\n";
}
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";

# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159

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

Источник: http://www.perlmonks.org/?node_id=94007

Обновить

О разнице между ourи myсм.

(Спасибо ThisSuitIsBlackNot ).


Не хотите объяснить «их»? Я всегда находил это запутанным.
rdodev 02

@rdodev: Что ты имеешь в виду?
Игорь Чубин

Я продолжаю видеть код Perl как с «моим», так и с «их», но на практике никогда не понимал разницы.
rdodev 02

3
@rdodev Думаю, вы имеете в виду our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot 02

1
Я думаю, что этот ответ требует некоторой корректировки. У вас есть пример кода, демонстрирующий использование my, но затем дополните его предложением, в котором говорится, localкак если бы вы только что продемонстрировали localиспользование, несмотря на то, что localэто нигде не демонстрируется в этом ответе. Я думаю, что вы неправильно процитировали исходный код PerlMonks, в котором есть два примера кода. Предложение о localописывало другое, а не то, которое вы здесь расшифровали.
temporary_user_name

5

Частные переменные через my () - это основная документация для my.

В указанном вами примере размера массива он не используется для определения размера массива. Он используется для создания новой переменной для хранения размера массива.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.