Як мені використовувати ключове слово “мій” у Perl?


90

Я продовжую бачити ключове слово "мій" перед іменами змінних у прикладах скриптів Perl в Інтернеті, але я навіть не уявляю, що це означає. Я спробував прочитати сторінки посібника та інші веб-сайти в Інтернеті, але мені важко розібратися, для чого це, зважаючи на різницю між тим, як я бачу, як він використовується, і посібником.

Наприклад, його використовують для отримання довжини масиву в цій публікації: Знайдіть розмір масиву в Perl

Але в посібнику сказано:

A my оголошує перелічені змінні локальними (лексично) для блоку, файлу чи eval, що вкладається. Якщо перераховано більше одного значення, список потрібно розмістити в дужках.

Що робить і як використовується?


3
Re "використовується для отримання довжини масиву в цій публікації", зовсім не. myне брав до цього жодного врахування. Це оператор присвоєння скалярів ( =), який застосував скалярний контекст @arr.
ikegami

Якщо воно насправді не «ваше», не слід ним користуватися.
icenac

Відповіді:


140

myобмежує область дії змінної. Область дії змінної - це те, де її можна побачити. Зменшення обсягу змінної до місця, де вона потрібна, є основним аспектом хорошого програмування. Це робить код більш читабельним і менш схильним до помилок, і призводить до безлічі отриманих переваг.

Якщо ви не оголосите змінну за допомогою my, замість неї буде створена глобальна змінна. Цього слід уникати. Використання use strict;повідомляє Perl, що ви хочете, щоб вам не дозволяли неявно створювати глобальні змінні, ось чому ви завжди повинні використовувати use strict;use warnings;) у своїх програмах.


Пов’язане читання: Навіщо використовувати use strict;та use warnings;?


11
Нарешті відповідь, яка пояснює, чому .
ThisSuitIsBlackНе 02

Для людей, які приходять сюди з JS: Це, по суті, як varі letв JavaScript. Без 'use strict';JS ви зможете декларувати нові глобальні змінні без жодного ключового слова, що не вважається найкращою практикою.
Електрична кава

@Electric Coffee, висловлюючись JS, запитання полягало б у тому, "що робить letі varробить і як їх слід використовувати?" І так, відповідь була б приблизно однаковою. ( letВари JS дуже схожі на myварли Perl , за винятком того, що letвари не можуть бути захоплені.)
ikegami

Я просто мав на увазі, що якби люди прийшли до Perl із JS, це був би простий спосіб пояснити те саме поняття
Electric Coffee

@ElectricCoffee 1) Програмісту, який розуміє масштаб, не потрібно повторно пояснювати їх після зміни мови. 2) Не впевнений, що ви насправді пояснювали масштаб, з точки зору, який програміст JS зрозумів би чи інакше. Може, ти намагався пояснити use strict;? Але це було не питання, і use strict;це робить більше. Або, можливо, ви мали намір поспілкуватися, що myобмежує сферу застосування варіантів, як це подобається letі varробиться, але це майже перше речення відповіді. 3) Якщо ви хочете відповісти на питання по-іншому, для цього і потрібні відповіді.
ikegami

27

Короткий підсумок: 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: Що ти маєш на увазі?
Ігор Чубін 02

Я постійно бачу код perl як із "моїм", так і з "їхнім", і на практиці ніколи не розумів різниці.
rdodev 02

@rdodev: чи не могли б ви надіслати мені посилання на якийсь код their?
Ігор Чубін

3
@rdodev Я думаю , що ви маєте в виду our: stackoverflow.com/questions/845060 / ...
ThisSuitIsBlackNot

4

Приватні змінні через my () є основною документацією для my.

У згаданому прикладі розміру масиву він не використовується для пошуку розміру масиву. Він використовується для створення нової змінної для розміру масиву.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.