Kann ich sicherstellen, dass Perl-Code, der auf 5.10+ geschrieben wurde, auf 5.8 ausgeführt wird?

StackOverflow https://stackoverflow.com/questions/3301082

  •  26-09-2020
  •  | 
  •  

Frage

Einige der neuen Funktionen von Perl 5.10 und 5.12, wie z. B. "say", sind als Funktionen definiert, die Sie mit dem Pragma "feature" explizit aktivieren oder deaktivieren können.Andere Zusätze, wie die benannten Erfassungsgruppen von regulären Ausdrücken, sind jedoch implizit.

Wenn ich Perl mit einem 5.10+ Interpreter schreibe, aber möchte, dass es auch auf 5.8 läuft, kann ich Perl dazu bringen, sich über die Verwendung von etwas zu beschweren, das nicht in 5.8 enthalten ist?Natürlich ist es eine gute Übung, Ihren Code auf allen Hauptversionen zu testen, auf denen er ausgeführt werden soll, aber es wäre trotzdem schön, wenn Perl mich automatisch warnen würde.

War es hilfreich?

Lösung

Wenn ich sicherstellen möchte, dass ein Programm unter bestimmten Versionen von Perl läuft, teste ich es unter dieser Version von Perl.Ein Merkmal meiner veröffentlichen anwendungstests unter mehreren Perls, bevor sie tatsächlich hochgeladen werden.

Dies setzt voraus, dass Sie über eine geeignete Testsuite verfügen und genügend Tests schreiben.Es ist auch einfach, mehrere separate Perl-Installationen gleichzeitig zu warten, wie ich in zeige Effektive Perl-Programmierung.

Test::Mindestversion klingt fast so, als ob es funktionieren könnte, aber es hat einige Einschränkungen.Es betrachtet nur die Datei, die Sie ihm geben (also überprüft es nichts, was Sie laden), und ich glaube nicht, dass es tatsächlich in Regex-Mustern aussieht.Jeder von ihnen meldet, dass die Mindestversion 5.004 ist, was für keinen von ihnen zutrifft:

#!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";
    }

Ein Teil des Grundes Perl::Minimale Version funktioniert, weil es nach Hinweisen sucht, die die Quelle bereits gibt, wie zum Beispiel use 5.010, und use feature und so weiter.Dies ist jedoch nicht die einzige Möglichkeit, Funktionen zu aktivieren.Und, wie Sie bemerken werden, vermisst es Dinge wie die /p flagge, zumindest bis jemand einen Scheck dafür hinzufügt.Sie werden solchen Dingen jedoch immer mit einem nachjagen PPI Lösung.

Es ist einfacher, es einfach zu kompilieren, die Tests auszuführen und es herauszufinden.

Andere Tipps

Ich glaube nicht, dass Sie Perl überprüfen können, wenn Sie den Code ausführen, aber Check out perl :: minimalversion und test :: minimalversion .(Letzteres ist nur ein test :: builder wrapper um den ersteren.)

Nun, dass andere Antworten lesen> App :: perlbrew kann Ihnen dabei helfen, mehrere Versionen von Perl zum Testen zu installieren und zu verwalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top