2006年05月11日 13:45 [Edit]

perl - 勝手に添削 - Storable

camel

というわけで、ひさかたぶりの勝手に添削のコーナーです。今回は、Storableに関して。

[を] Perl の Storable モジュールのメモ
store [ $first->{uhyo}, $first->{hogera} ], "a.dat";

codingそのものに問題はありませんが、damian本にも載っていないbest practiceをここで一つ紹介しましょう。

Always use nstore and nfreeze instead of store and freeze.
常にnstorenfreezeを使う事。storefreezeではなく。

理由は、その方がずっとつぶしが利くからです。頭に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だということです。どうです、面白いでしょ?

ところが、nfreezefreezeにしただけで、こうなっちゃうのです。

% ./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


この記事へのトラックバックURL

この記事へのコメント
久々に来ましたょ!ネタがなくて最近困ってます><;
Posted by レナです at 2006年05月11日 20:21