@nqounetです。
今回から新シリーズ「PerlとMooで学ぶDecorator - ログ解析パイプライン実装」をスタートします。
このシリーズでは、Webサーバーのアクセスログ(Apache/Nginx)をリアルタイムで解析するパイプラインツールを作りながら、デザインパターンの1つである「Decoratorパターン」を実践的に学んでいきます。
第1回は、すべての基礎となる「ログファイルを1行ずつ読み込むクラス」を作成します。
以前のシリーズ
このシリーズは、以下のシリーズの続編として位置づけています。Mooの基本についてはこちらを参照してください。
今回のゴール:LogReaderクラス
まずはシンプルに、指定されたログファイルを1行ずつ返す LogReader クラスを作ります。
Perl入学式で習った open や while を、Mooのクラスの中にカプセル化(包み込む)してみましょう。
コード例1: LogReader.pm
| |
ポイント解説
has filename: 読み込むログファイル名を指定するアトリビュートです。required => 1なので、newするときに必ず指定しないとエラーになります。has _fh: ファイルハンドルを保持するプライベートなアトリビュートです。default => undefで初期化しています。名前に_を付けるのは「内部用(プライベート)」を表す慣習です。sub BUILD: Mooの機能で、newが終わった直後に自動的に呼ばれます。ここでファイルをopenしています。Perl入学式で習ったopen my $fh, '<', $filenameと同じですね。sub next_line: 呼び出されるたびにファイルの次の1行を読み込んで返します。chompで改行コードを削除しています。
コード例2: 使用するスクリプト
このクラスを使う側のコード(main.pl)は以下のようになります。
| |
これで、オブジェクト指向スタイルでファイルを読み込む準備ができました!
なぜクラスにするの?
「普通に open して while で回せば良くない?」と思うかもしれません。
確かに単純なスクリプトならそれで十分です。しかし、クラス(オブジェクト)にしておくことで、「このLogReaderを別の部品と入れ替える」ことが簡単になります。
この「部品の入れ替え」や「部品の装飾(デコレーション)」こそが、今後学ぶDecoratorパターンの肝となります。
次回予告
次回は、読み込んだログの文字列を「意味のあるデータ(IPアドレスやステータスコード)」に分解します。正規表現を使って、ログパーサーへと進化させましょう!
第2回: ログが文字列のままでは、200以外の行を探すのも面倒。名前付きキャプチャでハッシュにする【LogParser】
