Wie installiere ich mehrere Perl-Versionen auf meinem lokalen Windows-System?

Inhalt:

Mehrere Perl-Versionen nebeneinander installieren (Multi-Perl-Installation)

Da es doch öfters einmal vorkommt, dass eineR mehrere Perl-Versionen braucht, weil zum Beispiel der eine Webserver mit Perl 5.6 und der andere mit Perl 5.8 oder gar 5.10 läuft, gibt es die Möglichkeit diese auch wirklich nebeneinander - außer mod_perl, da nur eine Perl-Version, weil diese schon beim Serverstart geladen wird! - laufen zu lassen.
Eine Multi-Perl-Installation funktioniert mit den Perl-Versionen 522, 5.6.1 und ab 5.8.3 und 5.10.0 von ActiveState.

Der Webserver und Perl sollten auf einem gemeinsamen Laufwerk installiert werden, damit keine Laufwerksbezeichner in Pfaden oder im SheBang angegeben werden müssen.

Vorgehensweise für eine Multi-Perl-Installation

Als Beispiel mit den Perl-Versionen 5.005_03, 5.6.1, 5.8.3 und 5.10.0 von ActiveState.

Ich gehe davon aus, dass der Webserver auf Laufwerk C: installiert wurde und dementsprechend auch Perl dort installiert werden sollte, damit die Zusammenarbeit klappt.
Es ist natürlich auch möglich, ein anderes Laufwerk zu verwenden. Dann ist in den folgenden Erläuterungen der Laufwerksbezeichner C: durch den neuen Laufwerksbezeichner aus zu tauschen.

  • Die verschiedenen Perl-Versionen in einzelne Verzeichnisse installieren

Vorzugsweise in solche Verzeichnisse:
C:\usr\local\perl\5.005 für Perl 5.005_03
C:\usr\local\perl\5.6 für Perl 5.6.1
C:\usr\local\perl\5.8 für Perl 5.8.3
C:\usr\local\perl\5.10 für Perl 5.10.0

  • Weitere Verzeichnisse erstellen

Die Eingabeaufforderung (DOS-Shell) aufrufen und folgendes eingeben:
mkdir C:\usr\bin 
mkdir C:\usr\local\bin

HELP Wozu diese Verzeichnisse?
Damit in Skripten der SheBang beibehalten werden kann, sind diese Verzeichnisse notwendig. In den meisten Perl-Skripten, die auf Servern laufen, lautet der SheBang oft #!/usr/bin/perl
In diese Verzeichnisse kommen später Verweise auf die unterschiedlichen Perl-Interpreter - das sind die perl.exe.

  • Verweise auf Dateien auf wichtige Perl-Dateien erzeugen

Damit Perl auch laufen kann, wenn es nicht im Installationsverzeichnis aufgerufen wird, benötigt es die perl.exe und die dazugehörige perl.dll.
In dieser Multi-Perl-Installation sind das die perl.exe aus den Perl-Verzeichnissen und die DLL-Dateien perlcore.dll für Perl 5.005, perl56.dll für Perl 5.6 und perl58.dll für Perl 5.8 sowie perl510.dll bei Perl 5.10.
Damit aus den zusätzlich angelegten Verzeichnissen Perl aufgerufen werden kann, müssen Verweise auf diese Dateien erzeugt werden.
ALERT! Eine Verknüpfung wie sie Windows erzeugt funktioniert nicht, da sie nicht auf Systemebene funktioniert!

Mit dem Programm ln.exe werden Verweise (als sogenannte Hardlinks) auf diese Dateien erzeugt.

HELP Wie rufe ich ln.exe auf?
ln Quelle Ziel
Quelle ist dabei die Originaldatei, Ziel die Datei als Hardlink
ALERT! ACHTUNG: ln.exe überschreibt gnadenlos schon vorhandene Dateien im Zielverzeichnis!
TIP Hinweis: Hardlinks funktionieren unter Windows nur mit dem NTFS-Dateisystem! Unter Vista und Windows 7 lasen sich Hardlinks auch über den Explorer erzeugen.

Jetzt werden die Hardlinks erzeugt.
Dazu wieder die Eingabeaufforderung starten und folgendes eingeben:
ln C:\usr\local\perl\5.005\bin\perl.exe C:\usr\bin\perl5005.exe 
ln C:\usr\local\perl\5.005\bin\perlcore.dll C:\usr\bin\perlcore.dll

ln C:\usr\local\perl\5.6\bin\perl.exe C:\usr\bin\perl.exe 
ln C:\usr\local\perl\5.6\bin\perl.exe C:\usr\bin\perl56.exe 
ln C:\usr\local\perl\5.6\bin\perl56.dll C:\usr\bin\perl56.dll

ln C:\usr\local\perl\5.8\bin\perl.exe C:\usr\bin\perl58.exe 
ln C:\usr\local\perl\5.8\bin\perl58.dll C:\usr\bin\perl58.dll

ln C:\usr\local\perl\5.10\bin\perl.exe C:\usr\bin\perl510.exe 
ln C:\usr\local\perl\5.10\bin\perl510.dll C:\usr\bin\perl510.dll

ln C:\usr\local\perl\5.005\bin\perl.exe C:\usr\local\bin\perl5005.exe 
ln C:\usr\local\perl\5.005\bin\perlcore.dll C:\usr\local\bin\perlcore.dll

ln C:\usr\local\perl\5.6\bin\perl.exe C:\usr\local\bin\perl.exe 
ln C:\usr\local\perl\5.6\bin\perl.exe C:\usr\local\bin\perl56.exe 
ln C:\usr\local\perl\5.6\bin\perl56.dll C:\usr\local\bin\perl56.dll

ln C:\usr\local\perl\5.8\bin\perl58.exe C:\usr\local\bin\perl58.exe 
ln C:\usr\local\perl\5.8\bin\perl58.dll C:\usr\local\bin\perl58.dll

ln C:\usr\local\perl\5.10\bin\perl.exe C:\usr\local\bin\perl510.exe 
ln C:\usr\local\perl\5.10\bin\perl510.dll C:\usr\local\bin\perl510.dll

  • Pfadangaben auf Perl aus der Umgebungsvariablen PATH löschen

In der Systemsteuerung unter SYSTEM kann die Umgebungsvariable PATH bearbeitet werden.
Alle Einträge, die auf ein Perl-Verzeichnis zeigen, sind durch die Installation von Perl erzeugt worden und müssen gelöscht werden.

  • Umgebungsvariable PATH erweitern

In der Systemsteuerung unter SYSTEM muss in die Umgebungsvariable PATH folgendes hinzugefügt werden:
C:\usr\bin;C:\usr\local\bin

  • In der Windows-Registry Einträge für die Perl-libs erstellen

Dabei gibt es mehrere Möglichkeiten, falls auf dem Rechner mehrere UserInnen arbeiten.

1. Perl darf von Allen verwendet werden
Das Programm Regedit.exe als Administrator aufrufen.
Den Schlüsselzweig \HKEY_LOCAL_MACHINE\Software\Perl suchen und unter 3. weiter machen.

2. Perl darf nur von bestimmten BenutzerInnen verwendet
Das Programm Regedit.exe als BenutzerIn aufrufen.
Den Schlüsselzweig \HKEY_CURRENT_USER\Software\Perl suchen
Fall dieser noch nicht existiert, muss er angelegt werden.

3. Im unter 1. bzw. 2. erzeugten Schlüssel Werte hinzufügen
Die Werte sind Zeichenfolgen, also vom Typ REG_SZ.
Name des Eintrags    Wert
lib-5.00503          C:\usr\local\perl\5.005\lib
sitelib-5.00503      C:\usr\local\perl\5.005\site\lib
lib-5.6.1            C:\usr\local\perl\5.6\lib
sitelib-5.6.1        C:\usr\local\perl\5.6\site\lib
lib-5.8.3            C:\usr\local\perl\5.8\lib
sitelib-5.8.3        C:\usr\local\perl\5.8\site\lib
lib-5.10.0            C:\usr\local\perl\5.10\lib
sitelib-5.10.0        C:\usr\local\perl\5.10\site\lib
lib                  C:\usr\local\perl\lib
sitelib              C:\usr\local\perl\site\lib

Weitere Fragen

Wie lauten jetzt meine SheBangs in den Skripten für die verschiedenen Perl-Versionen?

Die SheBangs in den Skripten lauten für die verschiedenen Versionen:
#!/usr/bin/perl für das Standard-Perl (hier Perl 5.6)
#!/usr/bin/perl56 für Perl 5.6
#!/usr/bin/perl5005 für Perl 5.005
#!/usr/bin/perl58 für Perl 5.8
#!/usr/bin/perl10 für Perl 5.10

Wieso kann ich die Skripte und Batchdateien aus dem installierten Perl nicht mehr aufrufen?

Das liegt daran, dass die Verzeichnisse der unterschiedlichen Perl-Versionen nicht mehr im Suchpfad sind.
TIP Zum Aufruf diese Batchdateien/Skripte eine eigene Batchdatei schreiben, in der vor Aufruf der Batchdatei/des Skripts die Umgebungsvariable PATH auf das dazugehörige Perl-Verzeichnis gesetzt wird.

Kann ich die Umgebungsvariablen PERLLIB und PERL5LIB? verwenden?

Ja und Nein.
Diese Umgebungsvariablen lassen sich nur global setzen. Das führt aber dazu, dass alle Perl-Versionen diese dann auslesen und auf ein und dasselbe lib-Verzeichnis zugreifen. Das gibt Probleme, weil Module und Perl-Interpreter nicht zusammen passen.

Wie findet Perl dann die eigenen Module?

ActiveStates Perl liest die Registry aus.
Unter \HKEY_CURRENT_USER\Software\Perl bzw. \HKEY_LOCAL_MACHINE\Software\Perl können Einträge vorhanden sein, die nach folgendem Schema gebildet werden:
lib-PERLVERSION          für das lib-Verzeichnis
sitelib-PERLVERSION      für das site\lib-Verzeichnis 
Anstelle von PERLVERSION steht dann die jeweilige Versionsnummer.
Leider hat ActiveState beim Sprung von ActivePerl 522 auf 5.6 und höher die Nummerierung geändert. Während für ActivePerl 522 dort 5.005_03 stehen sollte, muss für ActivePerl 5.6.1 dort 5.6.1 und für ActivePerl 5.8.3 dort 5.8.3 stehen.

Wieso klappt das nicht mit ActivePerl 5.6 und 5.8?

Aus irgendeinem Grund liest ActivePerl 5.8 (jedefalls bei 5.8.8) die Registry anders aus; bei der 5.8 werden die Einträge für lib ignoriert. Deswegen müssen, die Registryeinträge geänmdert werden.

Beispielsweise für ActivePerl 5.6.1 und 5.8.8 nur diese beiden Einträge:
lib-5.6.1 C:\usr\local\perl\5.6\site\lib;C:\usr\local\perl\5.6\lib
sitelib-5.8.8 C:\usr\local\perl\5.8\site\lib;C:\usr\local\perl\5.8\lib
Es darf für die 5.6 kein sitelib- und für die 5.8 kein lib-Eintrag vorhanden sein.

Wieso klappt das nicht mit ActivePerl 5.8 und 5.10?

Aus irgendeinem Grund übernimmt ActivePerl 5.8 und 5.10 die Librarypfade anders; Einträge für lib bei diesen Versionen werden ignoriert. Deswegen müssen die Registryeinträge in diesem Fall geändert werden.

Beispielsweise für ActivePerl 5.8.9 und 5.10.0 nur diese beiden Einträge:
sitelib-5.8.9 C:\usr\local\perl\5.8\site\lib;C:\usr\local\perl\5.8\lib
sitelib-5.10.0 C:\usr\local\perl\5.10\site\lib;C:\usr\local\perl\5.10\lib
Es dürfen für die 5.8.9 und 5.10.0 keine lib-Einträge vorhanden sein!

Wieso klappt das nicht unter Vista/Windows 7?

Unter Vista/Windows 7 hat sich die Registrystruktur bezüglich des Zweiges HKEY_LOCAL_MACHINE\SOFTWARE\Perl (wie es unter XP lautete) geändert. Deswegen müssen die Anpassungen für die site-lib- und lib-Einträge in einen anderen Zweig. Dieser Zweig heißt für Vista und Windows 7 nun HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Perl.

Vorteile der Multi-Perl-Installation

Besondere Vorteile bietet eine Entwicklungsumgebung, in der mehrere Perl-Versionen unabhängig voneinander laufen können.
So mancher Ärger und unnötige Mehrarbeit beim Programmieren, wenn das Perl des Servers sich von dem des Entwicklungssystems unterscheidet, können so vermieden werden. Das spart Kraft, Zeit und im professionellen Bereich oftmals viel Geld.

Nachteile der Multi-Perl-Installation

Natürlich sollen die kleinen, aber nicht unwesentlichen Nachteile nicht verschwiegen werden.

  • Beim Aufruf von bestimmten Skripten/Batchdateien aus dem jeweiligen Programmverzeichnis einer bestimmten Perl-Version muss explizit in dieses gewechselt werden, da die Umgebungsvariable PATH nicht auf dieses zeigt
TIP Wenn solche Skripte häufig verwendet werden, können Batchdateien geschrieben werden, welche die Umgebungsvariable PATH setzen und dann das Skript aufrufen.

  • Derzeit ist es nur möglich ActiveStates Perl als Multi-Perl-Installation zu verwenden.
Mit Binaries, die aus Quellcode von Perl.org und CPAN erzeugt wurden, habe ich keine Erfahrung.

Download von benutzten Programmen

Das Program ln.exe zur Erzeugung von Hardlinks gibt es im Paket lstools unter http://www.losoft.de/download/ls-tools.zip
ALERT! Nur unter Windows NT, 2000, XP mit NTFS-Dateisystem

-- GwenDragon - 20 Oct 2005

Ergänzungen, Kommentare

GwenDragon - 8 Jan 2006 - Änderungen bei 5.8.8

Die Registryeinträge bezüglich der lib- und sitelib-Pfade werden ab der Version 5.8.8 anders ausgewertet; weiteres im Abschnitt Weitere Fragen unter Wieso klappt das nicht mit ActivePerl 5.6 und 5.8?.

GwenDragon - 14 Dez 2009 - Änderungen bei 5.8.9 und 5.10.1; Änderungen bei Vista/Windows 7

Die Registryeinträge bezüglich der lib- und sitelib-Pfade werden ab der Version 5.8 und 5.10 anders ausgewertet; weiteres im Abschnitt Weitere Fragen unter Wieso klappt das nicht mit ActivePerl 5.8 und 5.10?. Unter Vista/Windows 7 lauten zudem die Registryeinträge bei KHKLM\Software\Perl anders. Diverse Tippfehler verbessert.

Kommentare werden am besten in folgender Form vorgenommen, damit sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff

UtilFaqSubForm edit

Titel Wie installiere ich mehrere Perl-Versionen auf meinem lokalen Windows-System?
Autor
Bereich FaqAllgemeines
Tags
Topic revision: r6 - 2009-12-14 - 11:25:18 - GwenDragon
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.