
というわけで、ひさかたぶりの勝手に添削のコーナーです。今回は、Storableに関して。
[を] Perl の Storable モジュールのメモstore [ $first->{uhyo}, $first->{hogera} ], "a.dat";
codingそのものに問題はありませんが、damian本にも載っていないbest practiceをここで一つ紹介しましょう。
Always use nstore and nfreeze instead of store and freeze.
常にnstoreとnfreezeを使う事。storeとfreezeではなく。
理由は、その方がずっとつぶしが利くからです。頭にnをつけるだけで、platform依存がなくなるのです。今からその例をお目にかけましょう。
server - nfreeze.cgi#!/usr/local/bin/perl -Tw use strict; use warnings; use CGI; # use CGI::Carp 'fatalsToBrowser'; use Storable qw(nfreeze); my $q = CGI->new; my $frozen = nfreeze $q; print $q->header( -type => 'application/x-storable', -content_length => length($frozen), ), $frozen; __END__client - lwp-thaw.pl
#!/usr/local/bin/perl use strict; use warnings; use Storable qw(thaw); use LWP::Simple; use Data::Dumper; my $uri = shift; my $frozen = get($uri); my $obj = thaw $frozen; print Dumper $obj; __END__
これで、lwpにremote objectを取ってこさせることが出来ます。やってみましょう。
% ./lwp-thaw.pl http://dan-albook.local/~dankogai/cgi/nfreeze.cgi $VAR1 = bless( { '.parameters' => [], '.charset' => 'ISO-8859-1', '.fieldnames' => {}, 'escape' => 1 }, 'CGI' ); % ./lwp-thaw.pl http://dan-albook.local/~dankogai/cgi/nfreeze.cgi\?foo=bar\&foo=baz\&test=src $VAR1 = bless( { '.parameters' => [ 'foo', 'test' ], 'test' => [ 'src' ], '.charset' => 'ISO-8859-1', 'foo' => [ 'bar', 'baz' ], '.fieldnames' => {}, 'escape' => 1 }, 'CGI' );
ここで注目していただきたいのは、鯖側はPowerPC Mac、倉側はIntel Macだということです。どうです、面白いでしょ?
ところが、nfreezeをfreezeにしただけで、こうなっちゃうのです。
% ./lwp-thaw.pl http://dan-albook.local/~dankogai/cgi/freeze.cgi Byte order is not compatible at ../../lib/Storable.pm (autosplit into ../../lib/auto/Storable/thaw.al) line 366, at ./lwp-thaw.pl line 10
そうなのです。少しでも別のマシンで(store|freeze)したものを(retrieve|thaw)しとく機会があるなら、はじめから(nstore|nfreeze)しといた方がいいのです。これは、NFS Serverを介して、見た目ローカルな場合の場合も含めますし、今回のようにマシンをupgradeした場合も含みます。performance penaltyもほとんど誤差の範囲。nなしバージョンははじめから使わないようにしておいた方が無難です。
データ互換性は、コード互換性よりもさらに重要でもあります。はじめから「後で読む」が利くよう心がけましょう。
Dan the Too Wierd to be Storable
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。