#!/usr/bin/perl use strict; use warnings; my @a = qw/a b c/; (@a) = (@a) x 3; print join(", ", @a), "\n";
3 Réponses :
Le problème est que vous essayez de modifier @A en place, que Perl ne vous permet pas de le faire. Votre deuxième exemple fait quelque chose de subtilement différent, qui consiste à créer un nouveau tableau composé de @A répété trois fois, puis écrasant @a avec cette valeur. P>
sans doute, le premier formulaire doit être traduit de manière transparente sur la deuxième forme, mais ce n'est pas ce qui se passe réellement. Vous pouvez considérer cela un bug ... déposez-le dans les endroits appropriés et voyez ce qui se passe. P>
Je suppose que Perl n'est pas une langue avec des transformations symboliques complètes. Il essaie de comprendre ce que vous voulez dire. Si vous "list-ify" Notez que cela ne fait pas ce que nous voulons: p> mais, cela fait: P> @A code> en le mettant en parens, il perd ce que vous vouliez l'affecter.
( @a ) = ( @a ) x 3;
Ouais, je ne l'ai monté que parce que je documente tous les opérateurs (github.com/cowens/cowens/perlopref) et je testais mon hypothèse naïve de ce qu'elle devrait faire.
Je ne pense pas que je vous appellerais un bogue, car le manuel Perl 4 mentionne explicitement qu'il ne fonctionne que sur des scalaires: cs.cmu.edu/afs/cs.cmu.edu/web/people/rgs/pl-exp-op. HTML # X
@mercator qui n'est pas le manuel Perl (qui serait soit le chameau, soit quelque chose d'accessible de perdoc code>). Le fait que cela documente le même comportement ne signifie pas que le comportement n'est pas un bug. Voir perdoc.perl.org/perlop.html#Assignment-Opérateurs pour le Documentation actuelle (5.10.1).
@mercator Hmm, qui semble être une page de proto-Perldoc à partir de Perl 4. Eh bien, étant donné qu'il s'agissait d'une erreur avant, de la fixer afin que cela fonctionne maintenant ne provoque pas de régressions et c'est pas Je suis documenté comme travaillant uniquement sur des scalaires à Perl 5.
@Chas. Owens en fait, il y a un rapport de bogue ouvert récent pour clarifier la documentation de la liste de liste: rt.perl.org/rt3/public/bug/display.html?id=68312 . Les modifications qu'il propose clarifier la seule cession qui fonctionne dans le contexte de la liste est l'affectation "ordinaire": "Ces autres opérateurs d'affectation sont tous des opérateurs d'affectation scalaire."
@mercator, je viens de suggérer un changement similaire sur p5p. Je ne me soucie pas vraiment si (@ a) x = 3; code> fonctionne ou non. Étant donné que je n'en ai jamais eu besoin dans 10 ans de programmation Perl, je ne pense pas que ce soit très nécessaire, mais le manque de documentation (moderne) m'inquiète.
Ma première pensée était que c'était un malentendu d'une subtilité sur la partie de Perl, à savoir que les parens autour de ne peut pas modifier% s en% s strong> p>
(f) Vous n'êtes pas autorisé à attribuer à l'élément indiqué ou d'essayer de
Changez-le, par exemple avec un incrément automatique. P>
BlockQuote> Apparemment ce n'est pas le cas, cependant. Si cela devait avoir la même erreur: p> plus de conclusivité, cela donne la même erreur: p> ergo , définitivement un bug. Déposer. P> p> @A code> ont fait une analyse comme une tentative d'attribution à une liste. (La liste elle-même, non pas de liste de liste normale.) Cette conclusion semble être prise en charge par Perldiag: