10
votes

Pourquoi est-ce que `$ v = () = divisé` retourne 1?

perdoc code> dit "une affectation de liste dans le contexte scalaire renvoie le nombre d'éléments sur le côté droit de la liste de la liste" mais lorsque j'essaie ce code:

perl -e '$_="aaaaa";print $v=(()=split //)'


0 commentaires

4 Réponses :


-2
votes

Oui, mais:

perl -e '$_="aaaaa";print $v=(($x,$y)=split //)'


4 commentaires

Depuis quand diviser ou liste des opérations renvoie des références de tableau de revenus?


Les listes sont PAS Tableaux. ((A, A, A, A, A)) est exactement équivalent à (A, A, A, A, A) et avoir 5 éléments.


Eh bien, je pensais que ($ x, $ y, (a ',', 'a', 'a')) a 3 éléments, ($ x, ' a ',' a ',' a ')) a 2 éléments et (((a', 'a', 'a', 'a', 'a') n'a qu'un. Cela n'a-t-il pas de sens?


@ Orabîg, check out p3rl.org/perldataa#list-value-constructeurs . Il y a aussi des informations utiles sur l'interpolation dans cette section. (Et il arrive également à expliquer exactement = () = construction utilisé dans cette question.)



-1
votes

Pourquoi vous assignez-vous à un tableau vide? le () = (Split //) bit. Ça va se retrouver avec - euh, bien, un gâchis. Ou, dans votre cas, un tableau avec une taille d'un avec pas beaucoup dedans.

aussi, c'est excessivement obscur. Perl a une triste réputation d'être en écriture uniquement, et tout ce qui modifiant $ _ et l'utiliser n'aider pas les autres - ou vous - comprendre ce qui se passe.

Essayez quelque chose comme < Pré> xxx

ou, si vous souhaitez reproduire le comportement de votre test: xxx


4 commentaires

Je veux juste tester la fonctionnalité de Perl, aucune utilisation pratique. Considérons ce code: Perl -e '$ _ = "AAAAA"; impression $ v = (() = // g)', cela fonctionne comme préciser


Il n'attribuait pas à un tableau vide, il affecte une liste vide. Je ne laisserais jamais mon code être revu par une personne qui ne connaît pas la différence :-) Cette astuce est connue comme "Opérateur de goAser" (voir CATONMAT.NET/BLOG/SECRET-PERL-OPERATORATS/#GOATSE ) et il est souvent très utile.


Une mauvaise habitude de mienne - je le fais avec des tuples python aussi. Mais je n'aime pas beaucoup beaucoup d'opérateurs sur cette page. Ils ajoutent à la seule écriture de la langue.


@Davecross, me faire none que certains appelent les gens appellent cette goate.



8
votes

Split a une sorte de folle ultra-magique qui lui permet de savoir quand il se trouve sur le côté droit d'une affectation qui a une liste sur le côté gauche et ajuste sa comportement selon le nombre d'éléments de cette liste.

Ceci est décrit dans PerlfuncC comme étant fait "pour éviter les travaux inutiles", mais vous avez trouvé une différence d'observabilité du comportement causé par cette optimisation .

Pour voir des preuves de ce qui s'est passé, exécutez votre script via Deparse comme ceci: xxx

: je suis allé À la recherche du code qui implémente cela, et ce n'est pas là que je m'attendais à ce que ce soit. En réalité, l'optimisation est effectuée par l'opérateur d'affectation ( op.c: perl_newassignop ). SPLIT ne sait pas que beaucoup de son contexte.


1 commentaires

très utile. Je connais la raison maintenant.



15
votes

Selon Split Documentation:

Lors de l'attribution à une liste, si la limite est omise, ou zéro, Perl fournit une limite plus grande que le nombre de variables dans la liste <...>

Depuis que vous spécifiez la liste vide, Split ne renvoie que 1 résultat et ce nombre de résultats est exactement ce qui se termine dans votre variable.


2 commentaires

C'est un cas étrange tranchant.


@ Darch, parfaitement documenté, rien de rien!