2012-08-04

いまさら perl v5.5

もっぱら perl はローカルで使ってるので、バージョンやモジュールで困ることはないのですが、
久しぶりにプロバイダの提供スペースで 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.004
perl 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