Python::Serialise::Pickle

MailmanのML毎の設定ファイルをPerlからあれやこれやで覗き見したいなぁとか
思ってたのですが、MailmanのML設定ファイルはcPickleというものを使ってバイナリーデータに
シリアライズされています。
cPickleはPickleの実装をCでしたもので1000倍高速だとか。
PythonはぜんぜんわからんのでPickleってなんやーな状態だったわけですが、
CPANにお尋ねしてみたら、Python::Serialise::Pickleってのがありました。
さすがCPAN

で、早速つかってみるのでした。

書き込み君

#! /usr/bin/perl
use strict;
use warnings;
use Python::Serialise::Pickle;

my $file = shift or die 'no file';
my $pw = Python::Serialise::Pickle->new("> $file");

$pw->dump(['a', 'list']);
$pw->dump("a string");
$pw->dump(42);
$pw->dump({'a'=>'hash'});

$pw->close();

読み込み君

#! /usr/bin/perl
use strict;
use warnings;
use Python::Serialise::Pickle;
use Data::Dumper;

my $file = shift or die 'no file';
my $pr = Python::Serialise::Pickle->new("<$file");
while (my $data = $pr->load()) {
    print Dumper $data;
}

読み込み結果

$VAR1 = [
          'a',
          'list'
        ];
$VAR1 = 'a string';
$VAR1 = '42';
$VAR1 = {
          'a' => 'hash'
        };

ただ、Mailmanのファイルを食わせるとダメポ。
We have no handler to deal with '}'
とか言って死ぬ。
うぐぐ、こうなったらInline::Pythonで(ry

my %_get_handlers = (
        'I' => \&_get_num,
        'L' => \&_get_num,
        'F' => \&_get_num,
        'S' => \&_get_string,
        'N' => \&_get_none,
        'l' => \&_get_list,
        'd' => \&_get_dict,
        'c' => \&_get_raw,
        'p' => \&_get_id,
        'i' => \&_get_raw,
        '(' => \&_get_compound,
);

確かに対応するもんがねーな。
2003年のモジュールだからしゃーねーのかな。
やっぱりInline::Pythonで(ry

Python::Serialise::Pickleはモジュールの中で、printしまくってるのがうざい。

参考)http://www.python.jp/doc/2.4/lib/module-cPickle.html

(追記)

http://rt.cpan.org/Public/Bug/Display.html?id=20244
おお、すでに!

(追記2)
よく読んだら時間がねーとかいってる。。放置系ですか><

(追記3)

やっぱり買うか。

みんなのPython
みんなのPython
posted with amazlet on 07.03.23
柴田 淳
ソフトバンククリエイティブ (2006/08/22)
売り上げランキング: 9497
おすすめ度の平均: 3.5
4 Pythonは使いやすそう
2 「初めてのPython」の焼き直し
5 日本人によって日本語で書かれたPython入門書