Jak należy używać słowa kluczowego „moje” w Perlu?

90

Wciąż widzę słowo kluczowe „moje” przed nazwami zmiennych w przykładowych skryptach Perla online, ale nie mam pojęcia, co to znaczy. Próbowałem czytać strony podręcznika i inne witryny w Internecie, ale mam trudności ze zrozumieniem, do czego służy, biorąc pod uwagę różnicę między tym, jak widzę jego użycie, a instrukcją.

Na przykład służy do pobierania długości tablicy w tym poście: Znajdź rozmiar tablicy w Perlu

Ale instrukcja mówi:

A my deklaruje wymienione zmienne jako lokalne (leksykalnie) do otaczającego bloku, pliku lub eval. Jeśli wymieniona jest więcej niż jedna wartość, listę należy umieścić w nawiasach.

Do czego służy i do czego służy?

Pięść furii
źródło
3
Re „Użyto jej do uzyskania długości tablicy w tym poście”, Wcale nie. myw najmniejszym stopniu nie uwzględniał tego. Jest to operator przypisania skalarnego ( =), który wymusił kontekst skalarny @arr.
ikegami
Jeśli nie jest naprawdę „twój”, nie powinieneś go używać.
icenac

Odpowiedzi:

141

myogranicza zakres zmiennej. Zakres zmiennej to miejsce, w którym można ją zobaczyć. Ograniczenie zakresu zmiennej do miejsca, w którym jest ona potrzebna, jest podstawowym aspektem dobrego programowania. Sprawia, że ​​kod jest bardziej czytelny i mniej podatny na błędy, a także daje mnóstwo pochodnych korzyści.

Jeśli nie zadeklarujesz zmiennej za pomocą my, zostanie utworzona zmienna globalna. Należy tego unikać. Użycie use strict;mówi Perlowi, że nie chcesz, aby niejawnie tworzył zmienne globalne, dlatego zawsze powinieneś używać use strict;(i use warnings;) w swoich programach.


Powiązana lektura: Dlaczego warto używać use strict;i use warnings;?

ikegami
źródło
11
Wreszcie odpowiedź, która wyjaśnia dlaczego .
ThisSuitIsBlackNot
Dla osób przyjeżdżających tutaj z JS: To jest zasadniczo jak variw letJavaScript. Bez 'use strict';JS możesz zadeklarować nowe zmienne globalne bez żadnego ze słów kluczowych, co nie jest uważane za najlepsze praktyki.
kawa elektryczna
@Electric Coffee, W terminologii JS, pytanie brzmiałoby: „Co robi leti varrobi i jak powinno się ich używać?” I tak, odpowiedź byłaby mniej więcej taka sama. (Warary JS letsą bardzo podobne do myzmiennych Perla , z tym wyjątkiem, że letzmiennych nie można przechwycić.)
ikegami
Miałem na myśli tylko to, że gdyby ludzie przychodzili do Perla z JS, to byłby łatwy sposób na wyjaśnienie tej samej koncepcji
Electric Coffee
@ElectricCoffee 1) Programista, który rozumie zakresy, nie musi mu go ponownie wyjaśniać po zmianie języka. 2) Nie jestem pewien, czy faktycznie wyjaśniłeś zakres w terminach, które programista JS zrozumiałby lub w inny sposób. Może próbowałeś to wyjaśnić use strict;? Ale to nie było pytanie, a use strict;robi coś więcej. A może miałeś na myśli komunikację, która myogranicza zakres vars, które lubią leti varrobią, ale to jest prawie pierwsze zdanie odpowiedzi. 3) Jeśli chcesz inaczej odpowiedzieć na pytanie, do tego służą odpowiedzi.
ikegami
27

Szybkie podsumowanie: mytworzy nową zmienną, localtymczasowo zmienia wartość zmiennej

W poniższym przykładzie $ :: a odnosi się do $ a w „globalnej” przestrzeni nazw.

$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

tj. localtymczasowo zmienia wartość zmiennej, ale tylko w zakresie, w jakim istnieje.

Źródło: http://www.perlmonks.org/?node_id=94007

Aktualizacja

O różnicy między ouri myproszę zobaczyć

(Dzięki ThisSuitIsBlackNot ).

Igor Chubin
źródło
Chcesz wyjaśnić „ich”? Zawsze uważałem je za zagmatwane.
rdodev
@rdodev: Co masz na myśli?
Igor Chubin
Ciągle widzę kod w Perlu zarówno z „moim”, jak i „ich”, ale w praktyce nigdy nie rozumiałem różnicy.
rdodev
@rdodev: czy możesz wysłać mi link do jakiegoś kodu z their?
Igor Chubin
3
@rdodev Myślę, że masz na myśli our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot
4

Zmienne prywatne za pośrednictwem my () to podstawowa dokumentacja dla my.

We wspomnianym przykładzie rozmiaru tablicy nie jest używany do znalezienia rozmiaru tablicy. Służy do tworzenia nowej zmiennej do przechowywania rozmiaru tablicy.

cjm
źródło