[perl] ありんく的モダンPerl
牧大輔 さんの名著 モダンPerl入門 を熟読している最近なのですが、熱いです。実務に直結したノウハウが満載です。
弊社もPerlをメインに開発を行っています。開発の過程で色々と方向性などのキメを繰り返してきているのですが、大体同じ方向になるよう、緩やかな決まり事を作っています。
「モダン」という言葉にちょっとあやかってみて、弊社内の決まり事をまとめて「ありんく的モダンPerl」を挙げてみます。
といっても、MooseやCatalystゴリゴリでという方向ではないです。昔からある手法やモジュールを使っててもよいですし、最新のモジュール利用もしています。
ポリシー
ざっくりとしたポリシーは、おおよそ以下でしょうか。
- プログラムが高速に動作する
- ハードウェアやOSに依存しない
- 後からも読みやすい。可読性が高い
- 頻繁に仕様変更しているモジュールに極度に依存しない
- 1つのサブルーチンの中は15ステップまで
Perlに限った話でなく、どの言語でも言える事ですね。永遠のテーマかも。
スタイル
ウェブアプリケーションの開発以外にも、統計データの解析や資料用データの作成の業務などもあるのですが、ほとんどをPerlでコーディングします。
使い捨てスクリプトから大規模アプリケーションまでベースとするスタイルは共通化させています。
- 強制的な指定がない限り、文字コードはUTF8で書く
- Perlのバージョンは5.8.8
- shebang は #!/usr/local/bin/perl
- /usr/bin/perl にPerlが存在する場合は、シンボリックリンクを張る
- 以下3つの宣言は必須
use utf8; use strict; use warnings;
- インデントは"タブ"ではなく"半角スペースx4"
- 全てのスクリプトはsubversionなどのバージョン管理システムに登録する
use utf8 させていますので、スクリプト自体にutf8フラグが立った状態になります。
利用するモジュールなど
- 文字コード変換にはEncodeを利用する
- Jcode.pm、jcode.plは使わない
- 日時計算まわりはDateTimeモジュールを利用する
- timelocal、Time::Piece、Posixは使わない。
- Class::Accessor::Fast、Cache::Memcached::Fast など、シンプルでオーバーヘッドが小さいモジュールを利用する
- Cache接続用のinstanceを作成する場合は、必ずsingletonにする
- XSがある場合はXS対応のモジュールを使う
- Text::CSV_XS、JSON::XS URI::Escape::XS XML::LibXMLなど
- ※XSをインストールできない場合はそれぞれのPurePerl版を利用する
- Text::CSV_XS、JSON::XS URI::Escape::XS XML::LibXMLなど
Webアプリ用フレームワーク
- Sledge を利用する
- ※UTF8に対応する必要があります
O/Rマッパー
- DBIx::MoCo を利用する
- まだ仕様変更が多いため DBIx::Classは使っていない
- ※昔のプロジェクトではClass::DBIを未だに利用しています。
- PagerはPagesetを利用する
- DBとのやり取りは全てDBIを経由して行い、SQLもDBに依存した書き方をしない。
- なるべくMySQL、PostgreSQLで同じに動作するようにする。(SQLiteも含みますが・・・)
テンプレート
- TemplateTookit を利用する
- プログラム冒頭にTemplate->newでインスタンスを初期化し、以降はなるべく最初にインスタンス化したTTを利用する。
- 必ずコンパイルする
- メール送信用のテンプレもTTを利用し MIME::Lite::TT::Japanese を利用する
まとめ
非常にざっくり過ぎるのですが、おおよそこの形でコーディングを行っています。
大してモダンなスタイルでもないのですが、この形であれば極端に遅くなることもないかと思います。
利用しているOSがCentOSとFreeBSDですので、WindowsのActivePerlは考慮していません。
画像処理周りなど、思いっきり落としていますね・・・・
多分他にも書き忘れている部分が多々あるので、追記していきたいと思います。








