あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

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

CGIの文字コードをUTF-8に

なぜこうしたか忘れた(汗)。
use CGI '-utf8';

作業ディレクトリの切替

Windowsの場合、スクリプトを置いてあるフォルダを作業ディレクトリにしておいて良いですけれど、 CGIではセキュリティが弱くなるため、Document Root(自分のサイトのトップレベル)よりも上に作業ディレクトリを置きます。 どちらの環境でも同じスクリプトが走るよう起動後に環境を判断して変数に作業ディレクトリを入れて 作業ディレクトリを扱う場合は変数を見るようにします。
my $workdir = '/home/??????????/??????????/postlist/';

環境を判断(WindowsかそれともFedoraか)

環境変数にOSがあればWindowsですが念のためOSの値に「Windows」が含まれていればWindowsとします。
# 開発環境の環境差異を吸収
if (exists $ENV{OS} && $ENV{OS} =~ /windows/i)
{

Windowsの場合はパラメタを読む

Fedoraの場合はCGIなのでパラメタuseridを読むコードがこんな感じ。
my $query = new CGI;
my $param = $query->param('userid");
Windowsの場合はCGIじゃないのでパラメタを利用します。
$param = $ARGV[0];

Windowsの場合はCP932で出力

コマンドプロンプトはCP932(シフトJIS+α)なので画面に表示する文字コードをCP932に切り替えます。 Fedoraの場合はUTF-8に切り替えます。
binmode STDOUT, ":encoding(cp932)"; #Windowsの場合
binmode STDOUT, ":utf8"; #Fedoraの場合