マスタリングPerl (10章 モジュールの修正と応急処置)
モジュール修正の解決策
- パッチを作者に送る
- diffコマンドを使用してパッチを作成する。
$ diff -u original_file updated_file > original_file.diff
-
- 作者はpatchコマンドで取り込み。
$ patch < original_file.diff
- ローカルパッチ
- モジュールのバージョンを非常に高い値にして、アップデートによる上書きを回避する。
our $VERSION = 99999;
- モジュールを引き継ぐ
- フォークする
- 一からモジュールを作成する
モジュールの一部を変更する
オリジナルのコードは変更しないで、問題点だけを修正する。
BEGIN内でモジュールをロードし、問題のサブルーチンを型グラブで再定義する。
BEGIN { use Sample::Module; no warnings 'redefine'; *Sample::Module::new = sub { ... ; } }
サブクラス化
変更が必要なモジュールを継承するサブクラスを作成する。
サブルーチンのラップ
Hook::LexWrapモジュールを使用して、サブルーチンをラップする。
Hook::LexWrapモジュールは、関数を書き換えずに関数の前後に処理を挿入したり、関数の返値を変更することができる。
#!/usr/bin/perl use strict; use warnings; use Hook::LexWrap; wrap 'foo', pre => sub { "前処理"; }, post => sub { "後処理"; }; sub foo { ... ; } # $_[-1]に値を設定すると処理を横取りしたり、戻り値を書き換えることができる。
Hook-LexWrap-0.26 - Lexically scoped subroutine wrappers - metacpan.org