ルモーリン

WindowsとFedoraの両方でPerlスクリプトを共用する方法

投稿:2012-11-14

WindowsXPで遊びに作ったPerlスクリプトが思いのほか上手い事動作するので自宅サーバで稼働しているFedoraのApacheでCGIスクリプトとして使いたい。 WindowsXPのコマンドプロンプトで動作するところまで作ったら、無修正でFedoraへFTPでもってコピーしたあとは、最後の動作確認をFedoraで行う様にしたいので、色々と工夫しました。
CGIに合わせて末尾4文字を.cgiにします。コマンドプロンプトではperl postlist.cgiという風に実行できるのでファイル名に制限がありません。
スクリプトの文字コードをUTF-8にします。 今時のPerlは変数名に漢字を使えるほどUTF-8が進んでいます。 内部処理がUTF-8なのでスクリプトの文字コードをUTF-8にしておくと何かと都合がいいですよ。
Perlの文字コード - 雑談 - ルモーリン
あと、UTF-8はBOMBの有る無しがありますけれど、BOMB無しがトラブル少ないです。 エディタは個人的趣味でGVIM(VIMのWindowx版)を使っています。 エディタでの文字コードやBOMBの設定を下記のようにします。
:set nobomb
:set fenc=utf-8
なぜこうしたか忘れた(汗)。
use CGI '-utf8';
Windowsの場合、スクリプトを置いてあるフォルダを作業ディレクトリにしておいて良いですけれど、 CGIではセキュリティが弱くなるため、Document Root(自分のサイトのトップレベル)よりも上に作業ディレクトリを置きます。 どちらの環境でも同じスクリプトが走るよう起動後に環境を判断して変数に作業ディレクトリを入れて 作業ディレクトリを扱う場合は変数を見るようにします。
my $workdir = '/home/??????????/??????????/postlist/';
環境変数にOSがあればWindowsですが念のためOSの値に「Windows」が含まれていればWindowsとします。
# 開発環境の環境差異を吸収
if (exists $ENV{OS} && $ENV{OS} =~ /windows/i)
{
Fedoraの場合はCGIなのでパラメタuseridを読むコードがこんな感じ。
my $query = new CGI;
my $param = $query->param('userid");
Windowsの場合はCGIじゃないのでパラメタを利用します。
$param = $ARGV[0];
コマンドプロンプトはCP932(シフトJIS+α)なので画面に表示する文字コードをCP932に切り替えます。 Fedoraの場合はUTF-8に切り替えます。
binmode STDOUT, ":encoding(cp932)"; #Windowsの場合
binmode STDOUT, ":utf8"; #Fedoraの場合