2010-07-21 14 views
6

Alcune delle nuove caratteristiche di Perl 5.10 e 5.12, come "dire", sono definiti come caratteristiche, che è possibile abilitare o disabilitare in modo esplicito utilizzando il pragma "caratteristica". Ma altre aggiunte, come i gruppi di cattura denominati di regex, sono implicite.Posso assicurarmi che il codice Perl scritto su 5.10+ funzioni su 5.8?

Quando scrivo Perl usando un interprete 5.10+, ma voglio che funzioni anche su 5.8, posso lamentarmi che Perl usi qualcosa che non è in 5.8? Ovviamente, è buona norma testare il codice su tutte le versioni principali su cui si intende eseguire, ma sarebbe comunque bello avere Perl avvisarmi automaticamente.

+2

Vedere anche: http://stackoverflow.com/questions/2500892/how-can-i-test-when-a-feature-was-added-to-perl – mob

risposta

8

Quando voglio assicurarmi che un programma venga eseguito con particolari versioni di perl, lo collaudo con quella versione di perl. Una funzionalità dei miei test delle applicazioni release in molti perls prima che vengano effettivamente caricati.

Ciò richiede di disporre di una suite di test adeguata e di test sufficienti. È facile mantenere contemporaneamente anche diverse installazioni separate perl, come mostrato in Programmazione Perl effettiva.

Test::MinimumVersion sembra quasi che funzioni, ma ha diverse limitazioni. Guarda solo il file che gli dai (quindi non controllerà nulla che carichi), e non penso che effettivamente guardi all'interno dei pattern regex. Ognuno di questi segnalare che la versione minima è di 5.004, che non è vero per nessuno di loro:

#!perl 

use Perl::MinimumVersion; 

my $p_flag = <<'SOURCE'; 
'123' =~ m/[123]/p; # 5.10 feature 
SOURCE 

my $named_capture = <<'SOURCE'; 
'123' =~ m/(?<num>[123])/; # 5.10 feature 
SOURCE 

my $r_line_ending = <<'SOURCE'; 
'123' =~ m/[123]\R/p; # 5.12 feature 
SOURCE 

my $say = <<'SOURCE'; 
say 'Hello'; 
SOURCE 

my $smart_match = <<'SOURCE'; 
$boolean = '123' ~~ @array; 
SOURCE 

my $given = <<'SOURCE'; 
given($foo) { 
    when(/123/) { say 'Hello' } 
    }; 

SOURCE 

foreach my $source ($p_flag, $named_capture, $r_line_ending, $say, $smart_match, $given) { 
    print "----Source---\n$source\n-----"; 
    my $version = Perl::MinimumVersion->new(\$source )->minimum_version; 
    print "Min version is $version\n"; 
    } 

Parte del motivo Perl::MinimumVersion funziona è perché si guarda per i suggerimenti che la fonte dà già, come ad esempio use 5.010, e use feature così via. Tuttavia, non è l'unico modo per abilitare le funzionalità. E, come noterai, mancano cose come la bandiera /p, almeno fino a quando qualcuno non aggiungerà un assegno. Tuttavia, sarai sempre a caccia di cose del genere con una soluzione PPI.

È più facile compilarlo, eseguire i test e scoprirlo.

+0

Grazie per la risposta incredibilmente approfondita (come al solito). Il nostro problema è, come così spesso, tonnellate di vecchio codice senza test. Tuttavia vedo che la tua risposta è quella giusta, accettata. –

+0

"say" può essere aggiunto da Perl6 :: Say 9 (lo uso da solo quando su 5.8.8) - quindi non ho intenzione di aggiungere il controllo per questo in Perl :: MinimumVersion. I regex sono troppo difficili da aggiungere, ma "dati" e "quando" devono essere aggiunti. –

+0

Devo notare che il problema non riguarda realmente Perl :: MinimumVersion, ma l'idea dell'analisi statica in Perl. Il PPI è meraviglioso, ma la nostra capacità di comprendere ciò che ha analizzato è fondamentalmente problematica perché Perl è speciale. :) –

4

non credo che si può fare il check Perl come si esegue il codice, ma check-out Perl::MinimumVersion e Test::MinimumVersion. (Quest'ultimo è solo un wrapper Test::Builder intorno al precedente)

+0

Hai qualcosa in cui funziona? Non penso che ti sarà d'aiuto. –

+0

Beh, non l'ho mai provato da solo, ma questo è il problema che sta tentando di risolvere. Quanto bene lo risolva è un'altra domanda. – cjm

1

Bene dalla lettura di altre risposte la risposta è no, ma forse App::perlbrew può aiutare a installare e gestire più versioni di perl per il test.

Problemi correlati