- 2008年10月22日 16:36
- 仕事のこと
例えばこんなコードを実行すると
#!/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 をキャッシュしたことがなかったのかなぁと思うとそうでもないような気がします。でも、キャッシュしたことがなかったんでしょうね。
- Newer: UNIQLOCK のこと
- Older: Air Mac 入院する
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 の時点でダメみたい。
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...