Wie soll ich das Schlüsselwort "my" in Perl verwenden?

88

Ich sehe das Schlüsselwort "my" immer wieder vor Variablennamen in Beispiel-Perl-Skripten online, aber ich habe keine Ahnung, was es bedeutet. Ich habe versucht, die Handbuchseiten und andere Websites online zu lesen, aber ich habe Schwierigkeiten zu erkennen, wofür sie gedacht sind, da ich einen Unterschied zwischen der Verwendung und dem Handbuch sehe.

In diesem Beitrag wird beispielsweise die Länge des Arrays ermittelt: Ermitteln der Größe eines Arrays in Perl

Aber das Handbuch sagt:

A my deklariert die aufgelisteten Variablen als lokal (lexikalisch) für den umschließenden Block, die Datei oder die Auswertung. Wenn mehr als ein Wert aufgeführt ist, muss die Liste in Klammern gesetzt werden.

Was macht es und wie wird es verwendet?

Faust der Wut
quelle
3
Re "es wird verwendet, um die Länge des Arrays in diesem Beitrag zu erhalten", überhaupt nicht. myhat es nicht im geringsten berücksichtigt. Es ist der Skalarzuweisungsoperator ( =), der den Skalarkontext erzwungen hat @arr.
Ikegami
Wenn es nicht wirklich "deins" ist, sollten Sie es nicht verwenden.
Icenac

Antworten:

137

myschränkt den Umfang einer Variablen ein. Der Umfang einer Variablen ist dort, wo sie sichtbar ist. Die Reduzierung des Gültigkeitsbereichs einer Variablen auf den Ort, an dem die Variable benötigt wird, ist ein grundlegender Aspekt einer guten Programmierung. Dies macht den Code lesbarer und weniger fehleranfällig und führt zu einer Reihe abgeleiteter Vorteile.

Wenn Sie eine Variable nicht mit deklarieren my, wird stattdessen eine globale Variable erstellt. Dies ist zu vermeiden. Mit using use strict;Perl möchten Sie verhindert werden, dass implizit globale Variablen erstellt werden. Deshalb sollten Sie in Ihren Programmen immer use strict;(und use warnings;) verwenden.


Verwandte Lektüre: Warum verwenden use strict;und use warnings;?

Ikegami
quelle
10
Endlich eine Antwort, die erklärt warum .
ThisSuitIsBlackNot
Für Leute, die von JS hierher kommen: Es ist im Wesentlichen wie varund letin JavaScript. Ohne 'use strict';JS können Sie neue globale Variablen ohne eines der Schlüsselwörter deklarieren, was nicht als bewährte Methode angesehen wird.
Elektrischer Kaffee
@Electric Coffee, In JS-Begriffen wäre die Frage "Was macht letund varmacht und wie sollten sie verwendet werden?" Und ja, die Antwort wäre ungefähr dieselbe. ( letmylet
JSs Vars sind Perls Vars
Ich meinte nur, wenn Leute von JS zu Perl kommen würden, wäre es eine einfache Möglichkeit, dasselbe Konzept zu erklären
Electric Coffee
@ElectricCoffee 1) Ein Programmierer, der das Scoping versteht, muss es sich nach dem Sprachenwechsel nicht noch einmal erklären lassen. 2) Sie sind sich nicht sicher, ob Sie das Scoping tatsächlich erklärt haben, wie es ein JS-Programmierer verstehen würde oder nicht. Vielleicht haben Sie versucht zu erklären use strict;? Aber das war nicht die Frage und use strict;macht mehr als das. Oder vielleicht gemeint Sie , dass die Kommunikation myGrenzen der Umfang von Vars irgendwie wie letund vartun, aber das ist so ziemlich der erste Satz der Antwort. 3) Wenn Sie eine Frage anders beantworten möchten, sind Antworten dafür gedacht.
Ikegami
26

Kurzzusammenfassung: myErstellt eine neue Variable und localändert vorübergehend den Wert einer Variablen

Im folgenden Beispiel bezieht sich $ :: a auf $ a im 'globalen' Namespace.

$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

dh, localändert vorübergehend den Wert der Variablen, jedoch nur innerhalb des Bereichs, in dem sie vorhanden ist.

Quelle: http://www.perlmonks.org/?node_id=94007

Aktualisieren

Über den Unterschied zwischen ourund mybitte sehen

(Dank ThisSuitIsBlackNot ).

Igor Chubin
quelle
Möchtest du 'ihre' erklären? Ich habe diese immer verwirrend gefunden.
Rdodev
@rdodev: Was meinst du?
Igor Chubin
Ich sehe immer wieder Perl-Code mit "meinem" und "ihrem" und habe den Unterschied in der Praxis nie ganz verstanden.
Rdodev
@rdodev: Könnten Sie mir bitte einen Link zu einem Code mit senden their?
Igor Chubin
3
@rdodev Ich denke du meinst our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot
4

Private Variablen über my () ist die Hauptdokumentation für my.

In dem von Ihnen erwähnten Beispiel für die Arraygröße wird die Größe des Arrays nicht ermittelt. Es wird verwendet, um eine neue Variable zu erstellen, die die Größe des Arrays enthält.

cjm
quelle