« xargsはすばらしい。 | メイン | ビジネスブログブック »

CacheとCache::Cacheというのがあるのね。

CacheとCache::Cacheというのがあるのね。モジュールの名前も似ているし、ややこしい。

URI::Fetchを使おうと思って、Cache::Cacheをいれて、URI::FetchのSYNOPSISのようなコードを書いて実行。

my $cache = Cache::File->new( cache_root => '/tmp/cache' );
my $res = URI::Fetch->fetch('http://example.com/atom.xml', {
     Cache => $cache
})

すると、Cache::Fileがないと言われる。
あれれと思ってよく読むと、Cache::Cacheではなくて、Cacheというモジュールに含まれるCache::Fileだと判明。
Cache::Cacheに入っているのは、Cache::FileCache

ただ、URI::Fetchのソースも見てみると、getとsetを利用しているだけ。Cache::Cacheでもかまわなそうと思い

my $cache = Cache::FileCache->new({cache_root => '/tmp/cache'});
my $res = URI::Fetch->fetch('http://example.com/atom.xml', {
     Cache => $cache
})

としてみた。
結果、普通に動いた。

CacheとCache::Cacheの違いはCacheモジュールの中に書いてある。

The Cache modules are a total redesign and reimplementation of Cache::Cache and thus not directly compatible. It would be, however, quite possible to write a wrapper module that provides an identical interface to Cache::Cache.
The semantics of use are very similar to Cache::Cache, with the following exceptions:
The get/set methods DO NOT serialize complex data types. Use freeze/thaw instead (but read the notes in Cache::Entry).


シンプルに使う分にはほぼ同じ。
複雑なデータの取り回しはすこし違うというわけですな。

ところで、URI::Fetchのキャッシュなのだが、getとsetメソッドだけ定義すれば良い訳で、
データベースを利用したりgetやsetの間にごにょごにょと何かを挟み込むことができそう。
URI::Fetchは中を見ると非常にシンプルなんだけど、非常に便利だなぁ。