2004年07月27日 (火)
4Fをハックしてみました
作りっぱなしで放置している4Fですが、最近フォームメールがなんか増えてきたので久々に使っていました。
でも、使い方忘れてた。。。ので、ハックして使い方を思い出しました。(BERO)
それはさておき、既存の4Fだと、CSVに連番ふってくれーとかいう場合に、4F module を作らないと簡単に対応できません。
csvモジュールを継承するだけなので簡単なのですが、毎回それをやるのは、ちとめんどいし、汎用的でもない。
ということで、Fileter.pmを拡張して、連番を付けられるようにしてみました。
【問い】プログラムのコード「顔文字の部分」を回答しなさい。(直すのがめどくさいので)
package FFFF::Module::Filter;
sub new {
my $class = shift;
my $self = bless {}, $class;
$self->prepare(
STR => \&filter_STR,
TIME => \&filter_TIME,
ENV => \&filter_ENV,
COUNT => \&filter_COUNT,
);
return $self;
}
sub filter_COUNT {
my ($format, $countfile, $lockfile) = (shift =~ /(.+):(.+?):(.+?)/);
my $count;
# ロック
open(LOCK, ">$lockfile");
flock(LOCK, 2);
# カウンタを増やす
open(COUNTER, $countfile);
$count = <COUNTER>;
$count++;
close(COUNTER);
open(COUNTER, ">$countfile");
print COUNTER $count;
close(COUNTER);
# ロック解除
flock(LOCK, 8);
close(LOCK);
return sprintf($format, $count);
}
として、
使い方は以下
xxx.cgi
<Module CSV>
File {TIME:../data/howto/%Y_%m.csv}
Header 受付日
Header 受付時間
Header ID
Header お名前
Save {TIME:%Y/%m/%d}
Save {TIME:%H:%M:%S}
Save {COUNT:S%05d:../data/count.txt:../data/count.lock}
Save name
</Module>
ちと強引。。。しかも、例えば自動返信メールにCSVと同じ番号を振りたいってのには対応不可。まぁ、今回はその機能はいらないみたいなので、コレで良しとする。
あー。4F作り直したくなってきた。4F内のモジュールは Slege使えないときの簡易フレームワークとしても使えるんだよなぁー。
posted by takefumi
|
この日記へリンク
|
コメント(2)
|
トラックバック(0)

