7
votes

Pourquoi est-ce que je reçois une erreur lorsque j'essaie d'utiliser l'opérateur d'attribution de répétition avec un tableau?

#!/usr/bin/perl

use strict;
use warnings;

my @a = qw/a b c/;
(@a) = (@a) x 3;
print join(", ", @a), "\n";

0 commentaires

3 Réponses :


0
votes

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.

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.


0 commentaires

1
votes

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" @A code> en le mettant en parens, il perd ce que vous vouliez l'affecter.

Notez que cela ne fait pas ce que nous voulons: p> xxx pré>

mais, cela fait: P>

( @a ) = ( @a ) x 3;


6 commentaires

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 ). 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


@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; 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.



4
votes

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 @A 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:

ne peut pas modifier% s en% s

(f) Vous n'êtes pas autorisé à attribuer à l'élément indiqué ou d'essayer de Changez-le, par exemple avec un incrément automatique.

Apparemment ce n'est pas le cas, cependant. Si cela devait avoir la même erreur: xxx

plus de conclusivité, cela donne la même erreur: xxx

ergo , définitivement un bug. Déposer.


0 commentaires