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 //)'
4 Réponses :
Oui, mais:
perl -e '$_="aaaaa";print $v=(($x,$y)=split //)'
Depuis quand diviser code> ou liste des opérations renvoie des références de tableau de revenus?
Les listes sont PAS B> 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')) code> a 3 éléments, ($ x, ' a ',' a ',' a ')) code> a 2 éléments et (((a', 'a', 'a', 'a', 'a') code > 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 = () = code> construction utilisé dans cette question.)
Pourquoi vous assignez-vous à un tableau vide? le 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. p> Essayez quelque chose comme p> < Pré> xxx pré> ou, si vous souhaitez reproduire le comportement de votre test: p> () = (Split //) code> 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.
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.
Ceci est décrit dans Pour voir des preuves de ce qui s'est passé, exécutez votre script via Deparse comme ceci: p> strong>: 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 ( Split code> 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. PerlfuncC CODE> comme étant fait "pour éviter les travaux inutiles", mais vous avez trouvé une différence d'observabilité du comportement causé par cette optimisation . P> op.c: perl_newassignop code>). SPLIT ne sait pas que beaucoup de son contexte. P> p>
très utile. Je connais la raison maintenant.
Selon Split code> Documentation: P>
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 <...> p> blockQuote>
Depuis que vous spécifiez la liste vide,
Split code> ne renvoie que 1 résultat et ce nombre de résultats est exactement ce qui se termine dans votre variable. P>
C'est un cas étrange tranchant.
@ Darch, parfaitement documenté, rien de rien!