2016-12-14 3 views
2

Vorwort: Ich weiß, wie man eine bestimmte Version eines Moduls lädt. Das ist nicht das wonach ich bin.Wie kann ich in Perl die Modulversion eines bestimmten Moduls ermitteln, das bereits geladen ist?

Ich schreibe ein Skript, um einige Text/Plain-Daten als JSON von einem internen Server in meiner Firma formatiert zu erhalten. Ich verwende LWP für den Datenabruf.

Ich habe alle das Skript selbst gemacht, aber ein Problem haben.

Ich schreibe dies auf RHEL5, die Perl 5.8.8 mit LWP 5.805 verwendet. Nach der folgenden Seite, wenn ich den Inhalt der Antwort direkt auf eine Datei ausgeben möchte, sollte ich verwenden :content_file => filename

JEDOCH wird Folgendes notiert.

Beachten Sie, dass diese „: content_file“ Option nicht unter älteren Versionen von LWP unterstützt wird, so dass Sie verwenden LWP Zugabe 5,66 berücksichtigen sollten; Überprüfen Sie die LWP-Version, wenn Sie glauben, dass Ihr Programm möglicherweise auf Systemen mit älteren Versionen ausgeführt wird.

Wenn Sie mit älteren LWP-Versionen kompatibel sein müssen, dann verwenden Sie diese Syntax, die die gleiche Sache tut:

use HTTP::Request::Common; $response = $ua->request(GET($url), $filespec);

Da dies RHEL 5, ich habe die ältere verwenden LWP-Format, aber ich möchte mein Skript so machen, dass es diesen neuen Stil anstelle des älteren Stils verwendet, wenn es auf RHEL 6 und höher ausgeführt wird, das eine neuere Version von LWP verwendet, die :content_file unterstützt.

Daher muss ich wissen, wie das Modul Version zu erkennen, und was noch wichtiger ist, ich muss wissen, was die früheste LWP Version ist :content_file

+0

Warum tun Sie nicht, wie der Kommentar suggeriert, und verwenden Sie einfach 'HTTP verwenden :: Request :: Common; $ response = $ ua-> request (GET ($ url), $ filespec) '' (unabhängig von der Version)? – ikegami

+0

Das ist nur mit älteren Versionen. Ich denke nicht, dass die neueren Versionen das unterstützen. – Speeddymon

+0

Das weitere Lesen der Kommentare zeigt, dass neuere Versionen abwärtskompatibel sind. – Speeddymon

Antwort

6

Die Versionsnummer der LWP::UserAgent ist in der Paketvariablen unterstützen $LWP::UserAgent::VERSION, oder Sie können $LWP::VERSION verwenden, wenn Sie use LWP geschrieben haben, um das Modul zu laden

Es gibt jedoch keinen Grund, verschiedene Methoden für verschiedene Versionen des Moduls zu verwenden; die rückwärtskompatible Alternative

my $response = $ua->request(GET($url), $filespec) 

wird auf einer beliebigen Version

+0

War nicht bewusst, dass neuere Versionen abwärtskompatibel sind. Werde es morgen auf RHEL 6 und 7 versuchen.Und wenn es funktioniert, werde ich das als die Antwort markieren. – Speeddymon

+0

Ich konnte dies heute auf RHEL6 bestätigen. Danke für die aufschlussreiche Antwort. – Speeddymon

+0

Übrigens haben Sie diese Lösung auch in Ihrer Frage zitiert. xD –

6

funktionieren Da alle Objekte aus UNIVERSAL erweitern, können Sie einfach $ua->VERSION tun, um die Version zu bekommen.

Es sieht so aus als ob :content_file in 5.66 hinzugefügt wurde. Vergleichen Sie die Dokumentation zwischen 5.65 und 5.66.

+0

Ja, dies ist der richtige Weg, um die Version eines beliebigen Moduls zu erhalten. (Die Konvention sieht vor, dass Module eine '$ VERSION'-Paketvariable haben, und das wird von der UNIVERSAL VERSION-Methode tatsächlich überprüft, aber falls ein Modul die VERSION-Klassenmethode überschreibt, gibt der Aufruf der Klassenmethode die autoritative Antwort.) – ysth

+1

@ysth Das ist Wunschdenken, da der CPAN-Indexer die Version von '$ VERSION', nicht' -> VERSION' ergreift. – ikegami

+0

@ikegami das ist die Distro-Version, keine Modul-Version – ysth

Verwandte Themen