2006年05月11日 13:45 [Edit]
perl - 勝手に添削 - Storable
というわけで、ひさかたぶりの勝手に添削のコーナーです。今回は、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
Posted by dankogai at 13:45│Comments(1)│TrackBack(0)
この記事へのトラックバックURL
この記事へのコメント
久々に来ましたょ!ネタがなくて最近困ってます><;
Posted by レナです at 2006年05月11日 20:21