久しぶりにプロバイダの提供スペースで CGI 使って遊ぼうと思い環境調査してみました。
#!/usr/local/bin/perl use strict; use warnings; print "Content-type: text/html;\n\n"; print "perl : $]<br>\n"; print "$_ : $ENV{$_}<br>\n" for sort keys %ENV;
なぜか500エラー。
shebang は合ってるしなんで?
試しに use を外してみたら動きました。
古いといっても v5.8 だろうと思っていたところ
驚愕の v5.5.3 !!!!!
ちょっと手元の corelist さんに聞いてみましょう。
corelist は v5.8.9 以降なら標準で入ってるみたいです。
C:\>corelist Module::CoreList Module::CoreList was first released with perl v5.8.9 C:\>corelist strict strict was first released with perl 5 C:\>corelist warnings warnings was first released with perl v5.6.0 C:\>corelist utf8 utf8 was first released with perl v5.6.0 C:\>corelist Encode Encode was first released with perl v5.7.3
・・・。
strict しか使えないじゃないですか!!
いまさら EUC でコーディングとかしたくないなー。
正直、サーバーのエラーログをエラーまみれにしそうな予感しかしない。
perl v5.5.3 で使えないもの
・warnings.pm・utf8.pm
・Encode.pm
# 3引数 open は perl v5.6 以降 open( INFO, ">", $datafile ) or die $!; # 間接ファイルハンドルも perl v5.6 以降 open( my $in, "> $infile" ) or die $!; # our も perl v5.6 以降 our $var; # 代わりに use vars use vars qw($var);
# perl v5.14 から一部の関数がリファレンスを受け取れるようになったので # この書き方で楽してるとデリファレンスでエラーが出てハマルかも。 http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements |----------------------------+---------------------------| | Traditional syntax | Terse syntax | |----------------------------+---------------------------| | push @$arrayref, @stuff | push $arrayref, @stuff | | unshift @$arrayref, @stuff | unshift $arrayref, @stuff | | pop @$arrayref | pop $arrayref | | shift @$arrayref | shift $arrayref | | splice @$arrayref, 0, 2 | splice $arrayref, 0, 2 | | keys %$hashref | keys $hashref | | keys @$arrayref | keys $arrayref | | values %$hashref | values $hashref | | values @$arrayref | values $arrayref | | ($k,$v) = each %$hashref | ($k,$v) = each $hashref | | ($k,$v) = each @$arrayref | ($k,$v) = each $arrayref | |----------------------------+---------------------------|
まだまだハマリどころがありそう。
文字コード周りは Jcode.pm を使うのかな。
500 Internal Server Error の対応
500エラーが出たときにサーバーのエラーログが見れない場合どうするか。CGI::Carp を使う。
C:\>corelist CGI::Carp CGI::Carp was first released with perl 5.004perl v5.4 からコアモジュールで安心。
# エラーをブラウザに表示 use CGI::Carp qw(fatalsToBrowser); # エラーをログファイルに書き出す BEGIN { use CGI::Carp qw(carpout); # perl v5.5.3 なので 3引数open は使えない open(LOG, ">> ./err.log") or die $!; carpout(LOG); }
fatalsToBrowser はメジャーだけど
carpout は今回調べるまで知らなかった。
他にも KCatch.pm というモジュールもあります。
perl v5.5.3 環境を作る?
perl のバージョンを切り替える perlbrew というものがありますが、Windows だと使えないっぽい。Strawberry Perl も ActivePerl も v5.5.3 のバイナリなんて置いてないしなー。
などとググってるうちに発見した Vector の Perl for Win32(perl5) は v5.5.7 らしい。
置いてあるディレクトリが win95 !!
これを入れる勇気はちょっとないなと。
いっそのこと、サーバー借りちゃった方が楽かもね。
参考リンク
History / Changes - perldoc.perl.org
コアドキュメント - perldoc.jp
Perl Hackers Hub:第14回 最新Perl使いこなし術―リファレンスの引き方,5.10以降の新機能(2)
Perl Hackers Hub:第14回 最新Perl使いこなし術―リファレンスの引き方,5.10以降の新機能(3)
perl5.10から5.16の新機能まとめ
CGI::Carp - search.cpan.org
[Perl] KCatch.pm/CGI エラーメッセージをブラウザに表示
Jcode - search.cpan.org
perlbrew - search.cpan.org
Windows で複数の perl を使い分けよう! - JPerl Advent Calendar 2010 Win32 Track
Strawberry Perl for Windows
ActivePerl
0 コメント:
コメントを投稿