2013-12-03 2 views
5

L'output di qr di perl è stato modificato, a quanto pare tra le versioni 5.10.1 e 5.14.2 e la modifica non è documentata, almeno non completamente.Quando e perché l'output di qr() è cambiato?

Per dimostrare il cambiamento, eseguire il seguente one-liner in ogni versione:

perl -e 'print qr(foo)is."\n"' 

uscita da perl 5.10.1-17squeeze6 (Debian Squeeze):

(?-xism:foo) 

uscita da Perl 5.14 0,2-21 + deb7u1 (Debian wheezy):

(?^:foo) 

La documentazione perl (perldoc perlop) dice :

$ rex = qr/mio.STRING/is;
stampa $ rex; # prints (? si-xm: my.STRING)
s/$ rex/foo /;

che sembra non essere più vero:

$ perl -e 'print qr/my.STRING/is."\n"' 
(?^si:my.STRING) 

Vorrei sapere quando si è verificato questo cambiamento (la versione di Perl, o sostenere biblioteca o qualsiasi altra cosa).

Alcuni di fondo, nel caso in cui sia rilevante:

Questo cambiamento ha causato una serie di test di unità al sicuro. Devo decidere se aggiornare semplicemente i test unitari per riflettere il nuovo formato o rendere i test sufficientemente dinamici per supportare entrambi i formati, ecc. Per prendere una decisione informata, vorrei capire perché il cambiamento ha avuto luogo. Sapere quando e dove è avvenuto sembra il posto migliore in cui iniziare quell'inchiesta.

+4

La tua terminologia, o forse la tua comprensione di ciò che 'qr' fa, non è giusto. Non è corretto dire "l'output di' qr' ". 'qr' è un operatore che crea un oggetto regex. Ciò che è cambiato è la stringificazione delle regex. Il comportamento di 'qr' non è cambiato. –

+0

@AndyLester: se si desidera ottenere informazioni tecniche, l'output * ha * modificato, almeno nei casi in cui viene utilizzato uno qualsiasi dei nuovi modificatori di espressioni regolari. Ma questo è davvero oltre il punto. Hai capito cosa significava la domanda, giusto? E sospetto che esprimerlo in un modo che potrebbe essere più letteralmente corretto perderebbe significato per un gran numero di persone che potrebbero cercare questa risposta in futuro. – Flimzy

+1

'qr' non ha output. Restituisce un oggetto. L '"output", o la stringificazione di quell'oggetto, è ciò che è cambiato. Nel caso di 'print qr/foo/i', la stringificazione è implicita. –

risposta

12

E 'documentato in perl5140delta:

espressioni regolari

(?^...) costrutto significa modificatori predefiniti

[...] Forzare a stringa di espressioni regolari ora usa questa notazione. [...]

Questa modifica è probabile che interrompa il codice che confronta le espressioni regolari con stringhe con stringhe fisse contenenti ?-xism.

La funzione regexp_pattern può essere utilizzata per analizzare i modificatori ai fini della normalizzazione.

5

Parte del motivo per cui questo è stato aggiunto, era che le espressioni regolari stavano ottenendo parecchi nuovi modificatori.

tuo esempio potrebbe realmente produrre qualcosa come questo se che il cambiamento non è avvenuto:

(?d-xismpaul:foo) 

Ciò anche in realtà non esprime i modificatori a posto.

d/u/l possono essere aggiunti solo ad una regex, non sottratto come i.
Si escludono a vicenda.

a/aa Esistono due livelli per questo modificatore.


Mentre il lavoro è andato in corso l'aggiunta di questi modificatori si è stabilito che questo si romperà un bel paio di test su moduli CPAN. Visto che i test si sarebbero interrotti comunque, è stato concordato che ci dovrebbe essere un modo per specificare semplicemente usare i valori di default ((?^:…)). In questo modo, i test non dovevano essere aggiornati ogni volta che veniva aggiunto un nuovo modificatore.

-1

Per ricevere il form stringificato di un'espressione regolare, è possibile utilizzare Regexp::Parser e il relativo metodo qr. Usando questo modulo non puoi solo testare la rappresentazione di una regexp, ma anche camminare su un albero.

+0

È interessante, ma non risponde alla domanda. – Flimzy

+0

corretto. Ma questo può aiutarti, come TS, a guardare il problema da un'altra angolazione: forse invece di testare _rappresentazione_, puoi testare _functionality_ (sia attraversando l'albero, sia confrontandolo con un albero di test). In questo modo renderai il tuo codice a prova di proiettile contro eventuali future modifiche incompatibili del motore Perl (solo in senso figurativo, ovviamente). – maxim4d

+0

Dovrebbe essere un commento, non una risposta. – Flimzy