2015-06-12 12 views
5

Ich habe vor kurzem einige Perl-Code von SunSolaris in eine Linux (Ubuntu) -Box von 64 Bit migriert. Nach der Migration mit dem folgenden Fehler brechen Storable.pm:Perl Fehler: keine Referenz

Byte order is not compatible at /usr/lib/perl/5.18/Storable.pm, at /home/VD/Cache.pm line 347. 

Nach einigen Recherchen im Internet fand ich, dass ich nfreeze statt thaw verwenden müssen, aber jetzt erhalte ich folgende Fehlermeldung:

not a reference at /home/VD/Cache.pm line 347. 

Irgendwelche Vorschläge, wie Sie das beheben können?

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

Welche Zeile ist home/VD/Cache.pm 347? – Jens

+0

return Speicherbar :: nfreeze ($ ret) if (definiert $ ret); – Darko1991

Antwort

0

Also, "keine Referenz" bedeutet ... genau das, was auf der Dose steht.

print Dumper $ret; 

produzieren - was tut

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

Also: Können Sie es das Ding mit Data::Dumper von Kommentaren diese Linie versuchen, den Druck? Ist es eine Referenz?

Ich bin nicht so sicher, obwohl Sie recht haben über nfreeze statt thaw, weil sie beide verschiedene Dinge tun. freeze packt eine Variable; thaw entpackt es. So kann nfreezefreeze ersetzen.

Aber der Hauptzweck dies zu tun ist, Ihren gepackten Skalar zu einem anderen Programm auf einer anderen Architektur zu übertragen. Machst du das?

Wenn ja, kann ich stattdessen vorschlagen, es als JSON oder XML stattdessen zu übertragen?

+0

Sie haben recht, wenn Sie ein Tauwetter auftauen, beide sind völlig verschieden. Ich muss Zeile 347 in der ursprünglichen Form verlassen: Rückkehr speicherbar :: tauw ($ ret) if (definiert $ ret); Aber das lässt mich mit meinem Kompatibilitätsproblem. Irgendwelche Vorschläge, wie man die Reihenfolge der Bytes korrigiert, ist nicht kompatibel unter /usr/lib/perl/5.18/Storable.pm, unter /home/VD/Cache.pm Zeile 347. ??? – Darko1991

1

Gehen Sie zurück zu Ihrem ursprünglichen System, thaw dann nfreeze die Datei dort, um es zu beheben.

perl -MStorable=nstore,retrieve -e'nstore(retrieve($ARGV[0]), $ARGV[1])' file fixed 
Verwandte Themen