2015-06-12 3 views
5

Недавно я перенес несколько кода Perl из SunSolaris в ящик Linux (Ubuntu) из 64 бит. После миграции Storable.pm разрывается со следующей ошибкой:Ошибка Perl: не ссылка

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; 
} 
+0

Какая линия находится дома/VD/Cache.pm 347? – Jens

+0

return Storable :: nfreeze ($ ret) if (определено $ ret); – Darko1991

ответ

0

Итак, «не ссылка» означает ... именно то, что он говорит на жестяной банке. Вы можете попробовать напечатать штуковина с Data::Dumper от комментариев именно эта строка:

return Storable::nfreeze($ret) if(defined $ret) 

Итак - что же:

print Dumper $ret; 

продукции? Это ссылка?

Я не уверен, что вы правы в необходимости использования nfreeze вместо thaw, потому что они оба делают разные вещи. freeze упаковывает переменную; thaw распаковывает его. Таким образом, nfreeze может заменить freeze.

Но основная цель этого - перенести упакованный скаляр в другую программу на другую архитектуру. Это то, что вы делаете?

Если да, то могу ли я предложить вместо этого перевести его как JSON или XML?

+0

Вы правы насчет nfreeze оттепели, оба совершенно разные. Мне нужно оставить строку 347 в исходной форме: return Storable :: thaw ($ ret) if (определено $ ret); Но это оставляет меня с моей проблемой совместимости. Любые предложения по исправлению порядка байтов несовместимы с /usr/lib/perl/5.18/Storable.pm, на /home/VD/Cache.pm, строка 347. ??? – Darko1991

1

Вернитесь в исходную систему, thaw, затем nfreeze файл, чтобы исправить его.

perl -MStorable=nstore,retrieve -e'nstore(retrieve($ARGV[0]), $ARGV[1])' file fixed 
Смежные вопросы