76 votes

Quelle est la difference entre my et local in Perl?

Je vois les deux utilisés dans ce script que j'essaye de déboguer et la littérature n'est tout simplement pas claire. Quelqu'un peut-il démystifier cela pour moi?

68voto

Jeremy Bourque Points 2443

La réponse courte est qu' my marque une variable privée dans un domaine lexical, et local marque une variable privée dans une dynamique étendue.

Il est plus facile de comprendre my, depuis que crée une variable locale dans le sens habituel. Il y a une nouvelle variable créée et qu'elle est accessible uniquement à l'intérieur de la enfermant lexicale bloc, qui est généralement marquée par des accolades. Il y a quelques exceptions à la bouclé renfort en règle, tels que:

foreach my $x (@foo) { print "$x\n"; }

Mais c'est juste Perl faire ce que tu veux dire. Normalement, vous avez quelque chose comme ceci:

sub Foo {
   my $x = shift;

   print "$x\n";
}

Dans ce cas, $x est privé de la sous-routine et de son champ d'application est délimité par les accolades. La chose à noter, et c'est tout l'opposé local, est que la portée d'un my variable est définie par rapport à votre code comme il est écrit dans le fichier. C'est au moment de la compilation phénomène.

Pour comprendre local, vous devez penser en termes de la pile d'appel de votre programme en cours d'exécution. Lorsqu'une variable est - local, il est redéfini à partir du moment où l' local exécution d'une instruction pour les tout-dessous de la pile, jusqu'à ce que vous retournez la pile de l'appelant du bloc contenant l' local.

Cela peut être déroutant au premier abord, donc, considérons l'exemple suivant.

sub foo { print "$x\n"; }
sub bar { local $x; $x = 2; foo(); }

$x = 1;
foo(); # prints '1'
bar(); # prints '2' because $x was localed in bar
foo(); # prints '1' again because local from foo is no longer in effect

Lors de l' foo est appelée la première fois, il voit la valeur globale de l' $x , qui est de 1. Lors de l' bar est appelé et local $x s'exécute, qui redéfinit le global $x sur la pile. Maintenant, quand foo est appelée à partir d' bar, il voit la nouvelle valeur de 2 $x. Jusqu'à présent ce n'est pas très spécial, parce que la même chose se serait passé sans l'appel à local. La magie, c'est que lorsqu' bar retours nous sortir de la dynamique portée par local $x et le précédent mondial, $x revient dans le champ d'application. Donc, pour le final de l'appel d' foo, $x est de 1.

Vous aurez presque toujours utiliser des my, depuis que vous donne la variable locale vous êtes à la recherche pour. Une fois dans une lune bleue, local est vraiment pratique pour faire des choses cool.

47voto

J.J. Points 3543

Dynamique De La Portée. C'est un pur concept. Beaucoup de gens ne l'utilisent pas, ou de les comprendre.

Fondamentalement, pensez my la création et à l'ancrage d'une variable dans un bloc de {}, A. K. A. champ d'application.

my $foo if (true); # $foo lives and dies within the if statement.

Ainsi, un my variable est ce que vous êtes habitué. tandis qu'avec la dynamique de la portée de $var peut être déclaré n'importe où et utilisé n'importe où. Donc, avec local - vous essentiellement de suspendre l'utilisation de cette variable globale, et d'utiliser un local "valeur" de travailler avec elle. Donc, local crée un temporaire de la portée pour une variable temporaire.

$var = 4;
print $var, "\n";
&hello;
print $var, "\n";

# subroutines
sub hello {
     local $var = 10;
     print $var, "\n";
     &gogo; # calling subroutine gogo
     print $var, "\n";
}
sub gogo {
     $var ++;
}

Cela devrait afficher:

4
10
11
4

30voto

Drew Stephens Points 4692

Citant l'Apprentissage de Perl:

Mais le local est mal nommée, ou au moins faussement nommé. Notre ami Chip Salzenberg dit que si jamais il obtient une chance de revenir dans une machine de temps à 1986 et de donner Larry un morceau de conseils, qu'il allait parler à Larry appel local par le nom de "sauver" la place.[14] c'est parce Que les locaux seront effectivement enregistrer les donnée de la variable globale à l'écart, de sorte qu'il sera plus tard automatiquement restauré à la variable globale. (C'est vrai: ces soi-disant "local", les variables sont en fait globals!) Ce sauvegarder-et-restaurer le mécanisme est le même que nous avons déjà vu deux fois, dans la variable de contrôle de boucle foreach, et dans le @_ éventail de paramètres de sous-programme.

Donc, local enregistre une variable globale de la valeur actuelle et puis le mettre à une certaine forme de vide. Vous verrez souvent il utilisé pour siphonner le fichier en entier, plutôt que de mener une ligne:

my $file_content;
{
    local $/;
    open IN, "foo.txt";
    $file_content = <IN>;
}

Appelant local $/ jeux de l'enregistrement de l'entrée du séparateur (la valeur que Perl arrête la lecture d'un "line") à une valeur vide, provoquant le vaisseau spatial de l'opérateur pour lire l'intégralité du fichier, de sorte qu'il n'est jamais arrivé sur l'enregistrement de l'entrée du séparateur.

18voto

Aristotle Pagaltzis Points 43253

Je n'arrive pas à croire que personne ne soit lié aux traités exhaustifs de Mark Jason Dominus sur le sujet:

8voto

dlamblin Points 14546

Bien Google fonctionne vraiment pour vous: http://www.perlmonks.org/?node_id=94007

À partir du lien:

Résumé: "mon" crée un nouveau variable, de "local" temporairement modifie la valeur d'une variable.

c'est à dire, de "local" changement temporaire de la la valeur de la variable, mais seulement dans le champ d'application il existe dans.

Utilisent généralement de mon, il est plus rapide et ne fait rien de bizarre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X