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?
Réponses
Trop de publicités?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.
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
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.
Je n'arrive pas à croire que personne ne soit lié aux traités exhaustifs de Mark Jason Dominus sur le sujet:
Et après, si vous voulez savoir à quoi
local
est bon,
Sept utilisations utiles delocal
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.