perlmonks からの相互投稿:
$work にある大雑把で古いコードをクリーンアップする必要があります。新しいモジュールを作成する前に、適切なものを誰かが知っている場合は、既存のモジュールを使用したいと思います。
実行時にファイルを解析して、一連のデータに対してどのような処理を行う必要があるかを判断します。
もし私がモジュールを書くとしたら、もっと一般的に (DBI 固有ではない) しようとしますが、私の正確なユースケースは次のとおりです:
SQL ファイルを読み取って、データベースに対して実行するクエリを決定しました。上部のコメントを解析し、
- 列 A には as/// を適用する必要があり、
- 列 B は、指定された形式の日付のように変換する必要があります。
- 列 C は一種の tr/// を取得します。
- さらに、列 D が s/// になるように連鎖させることができ、1 または 2 でない場合は 3 に設定します。
そのため、データベースからフェッチするとき、プログラムはデータを返す前にさまざまな (おそらくスタックされた) 変換を適用します。
現在、コードはひどく大きくて難しい一連の if 句を処理しており、命令の配列を読んだり維持したりするのが非常に困難です。
したがって、私が想像しているのは、おそらくこれらの行を解析し (さらに機能的なインターフェイスを公開し)、適用するプロセッサのリストを積み重ね、渡されたデータに対してそれを実行できるオブジェクトです。
必要に応じて、名前/カテゴリ オプションを指定して、1 つのオブジェクトを動的に使用して、特定の名前/カテゴリ/列のプロセッサのみをスタックすることができます。
伝統的に考案された例:
$obj = $module->new();
$obj->parse("-- greeting:gsub: /hi/hello"); # don't say "hi"
$obj->parse("-- numbers:gsub: /\D//"); # digits only
$obj->parse("-- numbers:exchange: 1,2,3 one,two,three"); # then spell out the numbers
$obj->parse("-- when:date: %Y-%m-%d 08:00:00"); # format like a date, force to 8am
$obj->stack(action => 'gsub', name => 'when', format => '/1995/1996/'); # my company does not recognize the year 1995.
$cleaned = $obj->apply({greeting => "good morning", numbers => "t2", when => "2010116"});
各プロセッサ (gsub、date、exchange) は個別のサブルーチンになります。プラグインは、名前でさらに追加するように定義できます。
$obj->define("chew", \&CookieMonster::chew);
$obj->parse("column:chew: 3x"); # chew the column 3 times
当然の最初の質問は、私が使用できるモジュールを知っている人はいますか? これまでに見つけることができたのは [mod://Hash::Transform] だけですが、実行時にどの処理を動的に行うかを決定するため、常に「複雑な」オプションを使用することになります。パーサー/スタッカーをビルドする必要があります。
私が利用/ラップしたい同様のモジュール、またはわずかに関連するモジュールを知っている人はいますか?
公共の消費のための一般的なものが何もない場合(確かに私のものだけが暗いパンではありません)、覚えておくべきことやインターフェイスの提案、またはDBIからのデータの戻り値を変更する以外の他の可能な用途について、誰かアドバイスがありますか?テキスト::CSVなど?
新しいモジュールを書くことになった場合、名前空間の提案はありますか? Data:: の下の何かがおそらく適切だと思います... 私のユースケースは PAM を思い起こさせるので、「プラグ可能」という言葉が頭に浮かび続けますが、本当に良いアイデアはありません...
- データ::プロセッサ::プラグイン可能?
- Data::Munging::Configurable ?
- 私::噛む::データ ?