Storable で Can't store CODE

例えばこんなコードを実行すると

#!/usr/bin/perl

use strict;
#use warnings;
use Storable qw//;

my $coderef = sub {};
my $freezed = Storable::freeze($coderef);
my $thawed  = Storable::thaw($freezed);

exit;

怒られます。

Can't store CODE items at blib/lib/Storable.pm (autosplit into blib/lib/auto/Storable/_freeze.al) line 339, at ./storable.pl line 12

これの解決として、$Storable::Deparse に真値を入れてあげればよいみたい。上記のコードに 「$Storable::Deparse = 1」 にみたいなことをして再度実行してみると

Can't eval, please set $Storable::Eval to a true value at blib/lib/Storable.pm (autosplit into blib/lib/auto/Storable/thaw.al) line 415, at ./storable.pl line 13

と怒られる。
今度は「please set $Storable::Eval to a true value」と言ってくれているので freeze のときに怒っていた人とは別の人ですね、きっと。 優しさを感じます。mst ではないことは確かですね。
で、結局スクリプトはこうなります。

#!/usr/bin/perl

use strict;
#use warnings;
use Storable qw//;
use Data::Dumper;

$Storable::Deparse = 1;
$Storable::Eval    = 1;

my $coderef = sub {};
my $freezed = Storable::freeze($coderef);
my $thawed  = Storable::thaw($freezed);

exit;

Cache::*** 系をデバッグしてて適当に Catalyst の $c をキャッシュしようと思ったら「Can't store CODE」のエラーに出くわしたんですね。今まで CODE をキャッシュしたことがなかったのかなぁと思うとそうでもないような気がします。でも、キャッシュしたことがなかったんでしょうね。

Comments:2

shot 2008年10月22日 19:30

気のせいかもしれないけど、別のマシンでthawしたらぶっ壊れた気がするから気をつけて!!
あとCatalystなら平気だと思うけど、
cgiとかで動的にOBJ->useしたobjectをcacheするとぶっ壊れてるから、
thawする前にOBJ->useしてあげないといけなかった気がするよ!

ちわ 2008年10月22日 20:58

> shot さん

あ、そうそう。昔バージョンが違う Fedore Core 間で freeze, thaw ができなかった。
動的に OBJ->use したものは試したことないけどね。
あと、XS を使った(XS で生成した?) CODE はキャッシュできないみたいね。これは詳しく調べてないけど

The result of B::Deparse::coderef2text was empty - maybe you're trying to serialize an XS function?

って怒られる。freeze の時点でダメみたい。

Comment Form

Trackbacks:1

TrackBack URL for this entry
http://hibinokoto.jp/mt/mt-tb.cgi/300
Listed below are links to weblogs that reference
Storable で Can't store CODE from 日々のこと
COMP/Perl/Storable/データ永続化、ファイル保存する方法 from PukiWiki Plus! (PukiWiki/TrackBack 0.4) 2008-11-09 (日) 11:54
http://hibinokoto.jp/archives/2008/10/post-295.html use Storable qw//; $Stora...

Home > 仕事のこと > Storable で Can't store CODE

Search
Feeds

Return to page top