紅堂流Perl入門

 Common Gateway Interface略して「CGI」ってのはウェブサーバ側で動くプログラムだ。
 逐次実行型インタプリタ言語「Perl」が有名。「PHP」や「JSP」、「ASP」は埋め込み型のスクリプト言語で、CGI。
 ここでは、CGIとして一般的に普及しているPerlを扱う。今はRubyもPythonもあるし、PHPも多いけれど。
 海外ではPHPも多いけど、日本国内ではPerl置けるサーバの方が多いようだし。

 人には人の使い方がある。紅堂がPerlを学んだ上でわかった事をここに遺す。
 言語を学ぶってことは、パートナーと付き合う事だ。人付き合いに似ている。
 Perlと上手く付き合っていく為に、相手(Perl)の事を最低限知ろう。
 CGI設置できりゃいいんだ! てな考え方では「尻に敷かれる」のが限度。付き合えやしない。
 最低限手綱握る事くらいはしたいよね。
 Windows環境でPerlを独学する上で「掛かった罠」も少し書いてある。参考になれば幸い。

 サーバ側に入っているPerlのヴァージョンによっても「性格」が変わる。PHPだってPHP4とPHP5で違う。
 大抵はPerl v5.6.x以降が入っているが、一部のサーバでは未だに5.005_03とか。つまりは「v5.5.x以前の物」が入っている。
 Perlを学ぶ上で大事なのは、設置サーバの環境だ。相手の性格を読んで対応しよう。
 ローカルで最新場で使えても、設置するサーバが古くては意味がない。@niftyはPerl v5.5が入っている(2008年初頭 現在)。
 →@niftyのような古いPerlヴァージョンのサーバ使用者は初心者から抜け出すのが困難かもしれない、ということ。
 v5.5.x以前では使えないモジュールが多いので使えないPerlスクリプトもある。
 本格的に始めるなら、Perldocを読んでも良い。英語版だから拒絶反応でない人だけどうぞ。

Perl 近年の経歴 ~2008年

 v4時代は知らないし、1995年以前の事だから10年以上前。もう設置サーバもないだろう。忘れてしまっても良い”過去”だから書かない。
 バージョン別の違い説明はWikipedia等を各自参照。Verにより使えないプラグマモジュールもあるから最低限覚えておきましょう。
 PerldocにあるPerl History読めばOKだけど、書いておく。

  • Perl v5.000 = 1994.10.17 <- v5.0系
  • Perl v5.001 = 1995.03.13 <- v5.1系
  • Perl v5.002 = 1996.02.29 <- v5.2系。プロトタイプ
  • Perl v5.003 = 1996.06.25 <- v5.3系。セキュリティ更新リリース。
  • Perl v5.004 = 1997.05.16 <- v5.4系。メジャーバージョン。5.0~5.3はほとんど使われていない。
    • Perl v5.004_05=1999.04.30 <- v5.4.5
  • Perl v5.005 = 1998.07.22 <- v5.5系。
    • Perl v5.005_04=2004.02.24 <- v5.5.4
  • Perl v5.6.0 = 2000.05.22 <- v5.6系以降偶数バージョンが安定版。v5.7やv5.9は開発版ということ。
    • Perl v5.6.2 = 2003.11.15
  • Perl v5.8.0 = 2002.07.18
    • Perl v5.8.8 = 2006.01.31
  • Perl v5.10.0 = 2007.12.18
  • Perl v5.12.0 = 2010.04.13
  • Perl v5.14.0 = 2011.05.14
  • Perl v5.16.0 = 2012.05.20
    • Perl v5.16.3 = 2013.03.11

 と、こんな具合だ。v5なら、v5.5以前かv5.6以降かで大きく違う。使えるプラグマモジュール幅というか。
 Perldocによるプラグマモジュールリストも読んどくと良いかも? use warnings;プラグマはv5.6以降かららしい。
 UNIX版Perlのtar.gzはhttp://www.perl.com/CPAN/src/にある。
 @niftyなら5.005_x(v5.5.x)のtar.gzを解凍して、libの中の~.pmを選んでアップロードすればuse strict;use CGI;use constant;程度は動く。
 プラグマのバージョンによっても書き方が違ったりするので注意が必要。use constantで一気に書けるのはPerl v5.8以降だ、とか。
 Active Perl v5.10.xになってからBenchmarkのusr+sys表示が小数第3位まで表示されるようになってた、とか。……Windows環境だけやん(滅)。

 どうでもいいけど、Vectorで公開されている1999.04.01公開の「Perl for Win32(pw32i316.exe)」はv5.003_07=v5.3.7だ。
 VectorのPerlカテゴリのDLランキングで1位のようだけどあまりにも古すぎる。落とそうとするなよ?
 ActiveStateの原形ActiveWareがビルドした物だね。Windows環境でのPerlはActiveStateのActivePerlを使おう
 それか、XAMPP(Apache+MySQL+PHP+Perl)でも【Strawberry Perlの5.16系入ってる】。
 Vectorとか大手サイトで配布しているから安心だ、なんて思ったらとんだトラップだ。昔そんなトラップに引っかかった人間がここに一人(爆)。
 いやぁ、Perl初心者すぎな癖に某Sharewareスクリプト購入して弄っててローカル内でApache+Perlでやろう、と思ったらPerl v5.003_07の説明書だったもんよ。その時点でもPerl v5.6.xは出てたはずだし。

プラグマが使えるかどうか

 プラグマ・モジュールはPerl 5.8以降で全力出せるものばかり。5.6や5.5以前では使えない物もある。
 その為、一部モジュールは@niftyの@homepageなど一部のプロバイダでは5.00503=v5.5.3で使えない。
 5.5ではstrictプラグマやCGI::Carpは使えるが、v5.6で登場したwarningsは使えないとか。
 5.8以降のサーバではEncode.pmが入ってるからJcode.pmをラッパーにしたスクリプトが使える。
 紅堂は、最低でもPerl v5.6の入ったサーバを想定してスクリプトを書くようにしている。

紅堂メモ Perl

use Benchmark qw(:all);なtimethese(10000, ~);cmpthese($res);でやったけど、
 eval評価する際には
eval "flock(OUT, 2);";
 よりも
eval { flock(LOG, 2); };
 の方がパフォーマンスが良い。他にも色々調べ中。変数よりuse constantで定数化した方が良いとか。

 ReadonlyモジュールはPerl v5.8以降では
Readonly my $NAME => 'Mikito KOUDOU';
 と書けるがそれ以前では
Readonly::Scalar my $NAME => 'Mikito KOUDOU';
 と書かなければならない、とか。古いバージョンの方が長ったらしいのが多いわけで。

簡単にWindowsでPerl/PHP開発環境を用意する

 パス設定が面倒なので、XAMPPのPerlと、04webserverを設定すると良い。PHPはXAMPPのApacheで動かしてで。それが一番手軽です。

以下は面倒だけど自力でやってみる人向け
■04WebServer → 04WebServer1**.zipを解凍してServerController.exeを起動。
http://www.soft3304.net/04WebServer/ #04WebServer v1.xx

■Windows版Perl環境……ActiveState「ActivePerl」v5.10.x
http://downloads.activestate.com/ActivePerl/releases/ #Active Perl 5.16.3
 →5.16.3.1603のActivePerl-5.16.3.1603-MSWin32-x86-296746.zipといった感じのZIPアーカイヴをc:\usr\に解凍。64BitPCならx64ね。C:\usr\bin\perl.exeがあればOK。

■Windows版PHP環境……PHP v5.x
http://www.php.net/downloads.php#v5 #PHP 5.x
 →Windows Binaries「PHP 5.x.x zip package=php-5.x.x-Win32.zip」をc:\usr\bin\に解凍。C:\usr\bin\php-cgi.exeがあればOK。
 その後「php.ini-dist」か「php.ini-recommended」を「php.ini」にリネームしてC:\Windowsディレクトリにコピーする。

■04WebServerの設定。「サーバ設定」→CGI/SSIの設定で
・ファイルの拡張子:cgi、「ファイルヘッダ無し」、「C:\usr\bin\perl.exe %FilePath% %Query%」
・ファイルの拡張子:php、「ファイルヘッダ無し」、「C:\usr\bin\php-cgi.exe %FilePath% %Query%」
 を追加。PATH切ってもいいけど。あと、ディレクトリ設定の「編集」でCGI動かしたいディレクトリの「詳細設定」で【SSI/CGIの許可】にチェック入れてサーバ再起動すれば動作します。