2009-04-20 4 views
5

Étant donné une alternance comme /(foo|foobar|foobaz)/ est-ce que Perl 6 fait des promesses sur lequel des trois sera utilisé en premier, et si c'est le cas dans la documentation, est-ce qu'il fait cette promesse?Est-ce que Perl 6 fait des promesses au sujet de la commande?

Voir la question associée Does Perl currently (5.8 and 5.10) make any promises about the order alternations will be used?.

+3

Il me semble que Perl 6 fait beaucoup de promesses. Jusqu'à ce que Larry nous donne une date de sortie réelle, je n'en croirai aucune :-) – bedwyr

+0

Hé bien, les règles semblent être faites pour la plupart et je ne m'attends pas à des changements à ce stade. Cela dit, si cela change, la réponse ici peut également changer. –

Répondre

10

S05 dit

À cette fin, chaque regex dans 6 Perl est nécessaire pour être en mesure de distinguer les modèles « purs » de ses actions, et retourner la liste des motifs de jeton initiaux (y compris transitive le jeton les motifs de n'importe quelle sous-liste appelée par la partie "pure" de cette expression régulière, mais n'incluant aucune sous-séquence plus d'une fois, car cela impliquerait l'auto-référence, ce qui n'est pas autorisé dans les expressions régulières traditionnelles). Une alternance logique utilisant | puis prend deux ou plusieurs de ces listes et des expéditions à l'alternative qui correspond au plus long préfixe de jeton. Cela peut ou non être l'alternative qui vient en premier lexicalement.

Toutefois, si deux alternatives correspondent à la même longueur, l'égalité est rompue d'abord par spécificité. L'alternative qui commence par la plus longue chaîne fixe gagne; c'est-à-dire qu'une correspondance exacte compte comme plus proche qu'une correspondance faite en utilisant des classes de caractères. Si cela ne fonctionne pas, le lien est cassé par l'une des deux méthodes. Si les alternatives sont dans des grammaires différentes, le MRO standard (ordre de résolution de la méthode) détermine celui à essayer en premier. Si les alternatives sont dans le même fichier de grammaire, l'alternative textuellement antérieure a la priorité. (Si les règles de grammaire sont définies dans plus d'un fichier, l'ordre est indéfini, et une affirmation explicite doit être utilisée pour forcer l'échec si le mauvais est essayé en premier.)

Cela semble être très différent Promise de celle faite en Perl 5.

13

Pour le dire en quelques mots: les alternatives devraient être mises en correspondance (au moins théoriquement) en parallèle, et le plus long match gagne. Si vous voulez des alternances séquentielles, vous pouvez utiliser la double barre ||, qui promet un ordre de gauche à droite tout comme | fait dans Perl 5 regexes.

Questions connexes