J'étais toujours sûr que si je passais un sous-programme Perl un scalaire simple, il ne peut jamais changer sa valeur en dehors du sous-programme. C'est: donc si je veux Puis j'ai découvert ce n'est pas le cas: p> et le même va pour les éléments de tableau: P> < Pré> xxx pré> qui m'a surpris. Comment cela marche-t-il? Le sous-programme ne fait-il que la valeur foo () code> pour changer
x code>, je dois transmettre une référence à
x code>. p>
3 Réponses :
Perl passe des arguments par référence, pas par la valeur. Voir http://www.troublewooters.com/codecorn/littperl/perlsub.htmleight/a > p>
+1, mais avec l'addition que la référence se casse si le OP écrit à la place mon $ notref = $ _ [0]; $ notref = 'inchangé!'; code> ceci (et l'avantage supplémentaire des noms lisibles) est pourquoi la plupart des sous-programmes commencent à attribuer tous les éléments dans
@_ code> à des variables nommées.
Le document que vous avez associé n'a pas été mis à jour depuis 2003, qui prédate 5.8.8, souvent considéré comme la version la plus ancienne "recommandée autorisée" de Perl. Une grande partie est encore exacte, mais il y aura des situations où la syntaxe a été modifiée ou améliorée.
Essayez le dernier persub à: perdoc.perl.org/perlsub.html ou vous voulez un Version plus ancienne: perdoc.perl.org/5.8.8/perlsub.html
Ceci est tout documenté en détail dans Perldoc Perlsub . Par exemple: p>
Tous arguments sont passés dans le tableau @_. Par conséquent, si vous appelez une fonction avec deux arguments, ceux-ci seraient stockés en $ _ [0] et $ _ [1]. Les Array @_ est un tableau local, mais ses éléments sont des alias pour les paramètres scalaires réels forts>. En particulier,
si un élément $ _ [0] est mis à jour, le L'argument correspondant est mis à jour (ou une erreur se produit s'il n'est pas mis à jour) strong>. Si un argument est un élément ou un élément de hachage qui n'existait pas quand le La fonction a été appelée, cet élément n'est créé que lorsque (et si) il est modifié ou une référence à celle-ci est prise. (Certaines versions antérieures de Perl ont créé le élément si l'élément a été attribué ou non.) L'attribution à l'ensemble de la matrice @_ supprime que l'aliasing et ne met pas à jour les arguments. P> blockQuote>
Quelqu'un devrait mentionner que l'aliasing est transitif, par exemple avec pour (@_) {s / ^ \ s + //; S / \ S + $ //} code>.
en Perl, les arguments de sous-programme stockés dans donc dans ce sous: p> Notez que cet aliasing se produit après l'expansion de la liste, de sorte que si vous avez passé une matrice à aliasing des arguments de sous-programme est une fonctionnalité très utile, mais doit être utilisée avec soin. Pour éviter la modification inattendue des variables externes, vous devez spécifier que vous souhaitez que vous souhaitiez des arguments aliasés appelés avec L'un des astuces moins connues mais utiles est d'utiliser cette Fonction d'aliasing permettant de créer des refures de réseau d'alias p> ou des tranches aliasées: p> Il s'avère également que l'utilisation de comme em> tchrist em> mentionne dans un Commentaire à une autre réponse, lorsque vous utilisez l'une des constructions d'aliasing de Perl sur enfin tout ce comportement est contestable, donc lorsque vous utilisez @_ code> sont toujours des alias sur les valeurs sur le site d'appel. Cet aliasing ne persiste uniquement dans
@_ code> si vous copiez des valeurs, c'est ce que vous obtenez, des valeurs.
Exemple code>, le tableau élargit dans le contexte de la liste et
@_ code> est défini sur des alias de chaque élément. de la matrice (mais le tableau lui-même n'est pas disponible pour
exemple code>). Si vous vouliez ce dernier, vous vous référez à la matrice. P>
rw code>. P>
SUB {@__} -> (Liste) CODE> Pour créer un tableau à partir d'une liste est en réalité plus rapide que
[Liste] code> car PERL n'a pas besoin de copier chaque valeur. Bien entendu, l'inconvénient (ou en fonction de votre perspective) est que les valeurs restent aliasées, vous ne pouvez donc pas les changer sans changer les originaux. P>
@_ code>, le
$ _ code> qu'ils vous fournissent sont également un alias aux arguments de sous-programme d'origine. Tels que: p>
@_ code> (ou une tranche de celui-ci) dans la liste des arguments de Un autre sous-programme, il reçoit également des alias aux premiers arguments du sous-programme: p>
Perl n'est pas C. Ne vous attendez pas à ce qu'il se comporte comme c, ou tout langage dérivé C tel que C ++ ou Java.
Perldoc Perlsub
Votre question concerne
@_ code>, pas
$ _ code>. Et
@_ code> dans un
sous code> contient souvent des alias plutôt que des copies de valeurs. Donc, si vous ne voulez pas ce comportement dans votre
sous code>, assurez-vous de copier l'entrée de
@_ code> à
Mes code> variables au début.
Je suis assez i> certain que cela est très bien documenté.