Perl error: not a reference

808 Views Asked by At

I recently migrated some Perl code from SunSolaris to a Linux(Ubuntu) box of 64 bit. After the migration Storable.pm is breaking with the following error:

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

After some research on the internet I found that I need to use nfreeze instead of thaw, but now I receive the following error:

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

Any suggestions how to fix this?

    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;
}
2

There are 2 best solutions below

0
On

Go back to your original system, thaw then nfreeze the file there to fix it.

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

So, "not a reference" means ... exactly what it says on the tin. Can you try printing the thingy with Data::Dumper from comments it's this line:

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

So - what does:

print Dumper $ret; 

produce? Is it a reference?

I'm not so sure though that you're right about needing nfreeze instead of thaw, because they both do different things. freeze packs a variable; thaw unpacks it. So nfreeze can replace freeze.

But the core purpose of doing this is to transfer your packed up scalar to another program on another architecture. Is this what you're doing?

If so, can I suggest instead considering transferring it as JSON or XML instead?