Comment utiliser le mot-clé «mon» en Perl?

90

Je continue de voir le mot-clé "mon" devant les noms de variables dans les exemples de scripts Perl en ligne mais je n'ai aucune idée de ce que cela signifie. J'ai essayé de lire les pages de manuel et d'autres sites en ligne mais j'ai du mal à discerner à quoi cela sert étant donné la différence entre la façon dont je le vois utilisé et le manuel.

Par exemple, il est utilisé pour obtenir la longueur du tableau dans cet article: Trouver la taille d'un tableau en Perl

Mais le manuel dit:

Un my déclare que les variables listées sont locales (lexicalement) au bloc, fichier ou eval englobant. Si plus d'une valeur est répertoriée, la liste doit être placée entre parenthèses.

Que fait-il et comment est-il utilisé?

FistOfFury
la source
3
Re "c'est utilisé pour obtenir la longueur du tableau dans ce post", pas du tout. myn'y a pas du tout tenu compte. C'est l'opérateur d'affectation scalaire ( =) qui a appliqué le contexte scalaire @arr.
ikegami
Si ce n'est pas vraiment "le vôtre", vous ne devriez pas l'utiliser.
icenac

Réponses:

139

myrestreint la portée d'une variable. La portée d'une variable est l'endroit où elle peut être vue. Réduire la portée d'une variable à l'endroit où la variable est nécessaire est un aspect fondamental d'une bonne programmation. Cela rend le code plus lisible et moins sujet aux erreurs, et se traduit par une multitude d'avantages dérivés.

Si vous ne déclarez pas de variable avec my, une variable globale sera créée à la place. Ceci est à éviter. Utiliser use strict;indique à Perl que vous voulez être empêché de créer implicitement des variables globales, c'est pourquoi vous devez toujours utiliser use strict;(et use warnings;) dans vos programmes.


Lecture connexe: Pourquoi utiliser use strict;et use warnings;?

ikegami
la source
10
Enfin une réponse qui explique pourquoi .
ThisSuitIsBlackNot
Pour les personnes venant ici de JS: c'est essentiellement comme varet leten JavaScript. Sans 'use strict';JS, vous pourrez déclarer de nouvelles variables globales sans aucun mot clé, ce qui n'est pas considéré comme la meilleure pratique.
café électrique
@Electric Coffee, En termes JS, la question serait "Que fait-on letet que varfaire et comment devraient-ils être utilisés?" Et oui, la réponse serait à peu près la même. (Les letvars de JS ressemblent beaucoup aux myvars de Perl , sauf que les letvars ne peuvent pas être capturés.)
ikegami
Je voulais simplement dire que si les gens venaient vers Perl depuis JS, ce serait un moyen facile d'expliquer le même concept
Electric Coffee
@ElectricCoffee 1) Un programmeur qui comprend la portée n'a pas besoin de le leur expliquer à nouveau après avoir changé de langue. 2) Pas sûr que vous ayez réellement expliqué la portée, en termes qu'un programmeur JS comprendrait ou non. Peut-être essayiez-vous d'expliquer use strict;? Mais ce n'était pas la question, et use strict;fait plus que cela. Ou peut-être que vous vouliez communiquer qui mylimite la portée des vars un peu comme letet varfaire, mais c'est à peu près la première phrase de la réponse. 3) Si vous souhaitez répondre à une question différemment, c'est à cela que servent les réponses.
ikegami
27

Résumé rapide: mycrée une nouvelle variable, localmodifie temporairement la valeur d'une variable

Dans l'exemple ci-dessous, $ :: a fait référence à $ a dans l'espace de noms 'global'.

$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

c'est-à-dire, localchange temporairement la valeur de la variable, mais uniquement dans la portée dans laquelle elle existe.

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

Mettre à jour

À propos de la différence entre ouret myveuillez voir

(Merci à ThisSuitIsBlackNot ).

Igor Chubin
la source
Voulez-vous expliquer «leur»? J'ai toujours trouvé cela déroutant.
rdodev
@rdodev: Que voulez-vous dire?
Igor Chubin
Je continue de voir du code Perl avec à la fois «mon» et «leur» et je n'ai jamais vraiment compris la différence, dans la pratique.
rdodev
@rdodev: pourriez-vous m'envoyer un lien vers du code avec their?
Igor Chubin
3
@rdodev Je pense que vous voulez dire our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot
4

Les variables privées via my () sont la documentation principale de my.

Dans l'exemple de taille de tableau que vous mentionnez, il n'est pas utilisé pour trouver la taille du tableau. Il est utilisé pour créer une nouvelle variable pour contenir la taille du tableau.

cjm
la source