2009-04-20 7 views
5

Dato un'alternativa come /(foo|foobar|foobaz)/, Perl 6 ha qualche promessa su quale dei tre sarà usato per primo, e se lo fa dove nella documentazione fa questa promessa?Perl 6 fa qualche promessa circa l'ordine in cui verranno utilizzate le alternanze?

Vedere la domanda relativa Does Perl currently (5.8 and 5.10) make any promises about the order alternations will be used?.

+3

Mi colpisce il fatto che il Perl 6 dia molte promesse. Fino a quando Larry non ci darà una data di uscita effettiva, non ci crederò nessuno di loro :-) – bedwyr

+0

Heh, beh, le regole sembrano essere fatte quasi sempre e non mi aspetto alcuna modifica a questo punto. Detto questo, se cambia, anche la risposta qui può cambiare. –

risposta

10

S05 dice

A tal fine, ogni espressione regolare in Perl 6 è richiesto di essere in grado di distinguere i suoi modelli "puri" dalle sue azioni, e restituisce la sua lista di modelli simbolici iniziali (transitivamente compreso il token schemi di qualsiasi sottoregola chiamata dalla parte "pura" di quella regex, ma non includendo alcuna sottoregola più di una volta, poiché ciò implicherebbe l'auto riferimento, che non è consentito nelle espressioni regolari tradizionali). Un'alternativa logica usando | quindi prende due o più di questi elenchi e dispacci all'alternativa che corrisponde al prefisso token più lungo. Questo può o non può essere l'alternativa che viene prima lessicale.

Tuttavia, se due alternative corrispondono alla stessa lunghezza, la parità viene interrotta prima per specificità. L'alternativa che inizia con la stringa fissa più lunga vince; cioè, una partita esatta conta come più vicina di una partita fatta usando le classi di personaggi. Se quello non funziona, il legame rotto da uno di due metodi. Se le alternative sono in grammatiche diverse, l'MRO standard (ordine di risoluzione dei metodi) determina quale testare per primo. Se le alternative si trovano nello stesso file di grammatica, l'alternativa testuale precedente ha la precedenza. (Se le regole di una grammatica sono definite in più di un file, l'ordine non è definito, e un'affermazione esplicita deve essere utilizzato per forzare fallimento se quella sbagliata è provato prima.)

Questo sembra essere molto diversa promettono da quella fatta in Perl 5.

13

Per dirla in poche parole: le alternative devono essere abbinate (almeno nominalmente) in parallelo, e la più lunga vittorie. Se vuoi le alternanze sequenziali, puoi usare la doppia barra ||, che promette un ordine da sinistra a destra, proprio come | fa in Perl 5 regex.

Problemi correlati