我最近将一些Perl代码从SunSolaris迁移到64位的Linux(Ubuntu)框中。迁移后Storable.pm
中断并显示以下错误:
Byte order is not compatible at /usr/lib/perl/5.18/Storable.pm, at /home/VD/Cache.pm line 347.
在互联网上进行一些研究后,我发现我需要使用 nfreeze
而不是 thaw
,但现在我收到以下错误:
not a reference at /home/VD/Cache.pm line 347.
有什么建议可以解决这个问题吗?
sub get
{
my($self, $type, $param_ref) = @_;
#return 1 if(!$self->{'INI'}{'sf.system.cache.enabled'});
if($self->{'INI'}{'sf.system.cache.database.enabled'})
{
### DATABASE
my $param = $self->SF::Cache::convert_parameter($type, $param_ref);
if($self->SF::Cache::CACHE_TABLE_USERCONTENT && $$param{'type'} == 2)
{
### user-content
my $query = 'SELECT PARAM_CONTENT AS C, DATA AS D FROM sf_cache_usercontent WHERE SITE=? AND PARAM_USER=?';
my $bindvar = { 1=>$self->{'site'}, 2=>$$param{'user'} };
my $sth = $self->db_select($query, $bindvar);
#print SF::Util::debug_dumpquery($query, $bindvar);
return undef if($self->{'Error'});
my %usercontent;
undef(%usercontent);
while(my $hashref = $self->db_fetch($sth))
{
$usercontent{$$hashref{'C'}} = $$hashref{'D'};# ? 1 : 0;
}
return %usercontent;
}
else
### ******************************************************************************************************
{
my $ret = $self->SF::Cache::get_database('DATA', $param);
return Storable::nfreeze($ret) if(defined $ret);
}
}
else
{
### FILESYSTEM
my $filename = $self->SF::Cache::filename($type, $param_ref);
if($filename && -e $filename)
{
if($self->{'INI'}{'sf.system.cache.lock.enabled'} && defined &lock_retrieve)
{
return lock_retrieve $filename;
}
else
{
return retrieve $filename;
}
}
else
{
$! = 0;
}
}
return undef;
}
返回到原始系统,thaw
然后nfreeze
文件进行修复。
perl -MStorable=nstore,retrieve -e'nstore(retrieve($ARGV[0]), $ARGV[1])' file fixed
因此,"不是参考"意味着...正是它在锡上所说的。你能尝试打印带有评论Data::Dumper
的东西吗,它是这一行:
return Storable::nfreeze($ret) if(defined $ret)
所以 - 什么:
print Dumper $ret;
生产?是参考吗?
我不太确定你需要nfreeze
而不是thaw
是对的,因为它们都做不同的事情。 freeze
包含一个变量; thaw
解开包装。所以nfreeze
可以取代freeze
.
但这样做的核心目的是将打包的标量转移到另一个架构上的另一个程序。这就是你正在做的事情吗?
如果是这样,我是否可以建议考虑将其作为JSON
或XML
转移?