UTF-8で書かれたプログラムをPARでパッキングしても、Unrecognized characterが発生して実行できません。

ppmで取得できるPARのバージョンは古いので、最新バージョンをCPANから取ってくる。WindwosでCPANを使うのは面倒ですね。新たにnmake、tar、tarに必要なDLL、unzipをインストールしました。wgetgzipあたりも必要です。この辺りのプログラムをまとめて入れてくれるような便利な何かはないのでしょうか。

さて、PARのバージョンを上げたわけですが、状況は一向に変わりません。いろいろぐぐって見つけた次のページによると、
http://www.mail-archive.com/par@perl.org/msg01655.html
なんとバイトコードに変換してパッキングするという方法で回避できるようです!

pp -f Bytecode -M ByteLoader foo.pl

こんな感じ。
簡単なスクリプトならこれでうまく動きます。しかしながら、本当に動かしたいちょっと複雑なスクリプトでは実行時エラーが発生します。何故ー。

perlccでこんなふうにバイトコード化したものは普通に実行できるのになあ。(手元の『プログラミングPerl第3版』では、バイトコード化するオプションが-bになっているけど、-Bが正しいみたい)

perlcc -B -o byte.pl foo.pl

ということは…?

バイトコード化したものをPARでパッキングしようとしてみます。

pp -M ByteLoader byte.pl

とすると、Binary 'byte.pl' sure doesn't smell like perl source!と怒られてしまいました。代わりにバイトコード化する前のファイルをパッキングして、exeファイルの中身をちゃんと実行できるバイトコードに無理矢理書き換えてみようとするも(zipで圧縮されている)、なかなかうまくいかず。

しかしついに解法が判明しました!複数スクリプトをパッキングするのです。
perlccでバイトコード化したものをbyte.plとし、Hello, World!でも何でも良いので適当なPerlスクリプトをfoo.plとします。

pp -M ByteLoader -o byte.exe foo.pl byte.pl

どういうわけか、2番目以降のスクリプトについては「まともなPerlスクリプトにしろ!」と怒られる事はないようです。なお、複数スクリプトをパッキングしたexeファイルは、そのファイル名と同一のPerlスクリプトが優先的に実行されるようなので、実行ファイルの名前はbyte.exeにします。
何やら反則技のような気がしますが、これで無事に、UTF-8で書かれたPerlスクリプトを実行ファイルにすることができました。めでたしめでたし。
それにしても、なぜPerlccでバイトコード化したものはちゃんと動いて、PARのBytecodeフィルターでバイトコード化したものが動かないのか、結局わかりませんでした。それぞれ見比べてみると、それなりに違いはありますが、バイトコードなんて読めないし…。