2023年10月追記
XAMPのPerlには今でもppm.batが同梱されていますが、以下のようにもうPPMのモジュールはビルドされていないためPMMからモジュールをインストールすることはできません。
https://www.activestate.com/products/perl/ppm-perl-modules/
UPDATE 2021: PPM has been removed from ActivePerl 5.28, and will no longer build many packages for previous versions of ActivePerl.
はじめに
WindowsのPerlにはPPMというパッケージマネージャがあります。cpanだとバイナリモジュールはローカルでビルドされてインストールされるのでビルド環境が必要になりますが、PPMではバイナリパッケージとしてインストールできるのでビルド環境を用意する必要がないため便利です。
問題
そのPPMですが、XAMPP WindowsのPPMを実行するとエラーになって動きません。
XAMPPのPPMは C:\xampp\perl\bin\ppm.bat にあるのでこれを実行します。
すると以下のダイアログが表示されます。
そしてOKボタンをクリックするとコンソールに以下のメッセージが表示され終了してしまいます。
Can't load 'C:/xampp/perl/vendor/lib/auto/XML/Parser/Expat/Expat.dll' for module XML::Parser::Expat: load_file:指定されたモジュールが見つかりません。
at C:/xampp/perl/lib/DynaLoader.pm line 190.
at C:/xampp/perl/vendor/lib/XML/Parser.pm line 18.
Compilation failed in require at C:/xampp/perl/vendor/lib/XML/Parser.pm line 18.
BEGIN failed--compilation aborted at C:/xampp/perl/vendor/lib/XML/Parser.pm line 22.
Compilation failed in require at C:/xampp/perl/vendor/lib/PPM.pm line 28.
BEGIN failed--compilation aborted at C:/xampp/perl/vendor/lib/PPM.pm line 28.
Compilation failed in require at ppm.bat line 35.
BEGIN failed--compilation aborted at ppm.bat line 35.
これはXML::Parser::ExpatモジュールのDLLがExpat本体のDLLを読み込もうとして失敗しているためです。
なぜ失敗するかというと、単純にXAMPPに libexpat-1_.dll が入っていないからなのです。
XAMPPでインストールされるPerlは「Strawberry Perl」というもので、これのZIP editionのフォルダ構造は以下のようになっています。
先ほど読み込めなかったDLLはcフォルダの中のbinフォルダにあります。が、ZAMPPにはperlフォルダしか含まれていません。つまり、外部のライブラリのDLLを必要とするPerlモジュールは不完全にインストールされている状態になっているわけです。これはひどい。
解決方法
この問題をググると「libexpat-1_.dll」で検索して出てきたDLLダウンロードサイトからDLLを入手してExpat.dllと同じフォルダに置くという方法が見つかります。謎のDLLダウンロードサイトの信頼性はともかくとして、他のモジュールも同じように不完全な状態になっているため、状況によっては次から次へDLLの読み込みエラーが発生してもう対応を諦めたくなったりするので、この方法はお勧めできません。
ということで、完全に解決する方法が以下になります。
cフォルダを入手する
まずはお目当てのDLLが入っているcフォルダを入手します。
以下のページからXAMPPでインストールされたPerlと同じバージョンのZIP editionを入手します。
入手したZIPアーカイブを展開し、cフォルダを C:\xampp\perl\ にコピーします。
cフォルダにパスを通す
DLLが読み込まれるようにパスを通します。
環境変数 PATH に C:\xampp\perl\c\bin を追加します。
環境変数を変更した後は念のため再起動した方が良いかもしれません。
以上で動作するようになります。
ちなみにDLLの検索パスは以下のようになっているので C:\xampp\perl\bin に必要なDLLだけコピーして置けば動くようになるような気がするのですが、なぜかApacheからの実行の際にはDLLが読み込めなくてエラーになります。他にもカレントディレクトリが C:\xampp\perl\bin 以外の場所のときに PPM.bat を実行すると駄目というのがあります。Perl本体を実行した時はどこでも動作するのですが……
- 実行中のプロセスの実行形式モジュールがあるフォルダー。
- 現在のフォルダー。
- Windows システム フォルダー。 このフォルダーへのパスは、GetSystemDirectory 関数が取得します。
- Windows ディレクトリ。 このフォルダーへのパスは、GetWindowsDirectory 関数が取得します。
- 環境変数 PATH 内に記述されたフォルダー。