Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 数据::转储程序::冷冻柜正确使用_Perl_Serialization - Fatal编程技术网

Perl 数据::转储程序::冷冻柜正确使用

Perl 数据::转储程序::冷冻柜正确使用,perl,serialization,Perl,Serialization,我正在尝试在一个旧的大型Perl项目中记录数据结构。为了做到这一点,我使用了一些结构,但是,有点太大,垃圾邮件的日志。因此,我正在寻找一种方法,以一种不太冗长的方式记录它们 现在,Dumper的文档提到了可用于修复该问题的$Data::Dumper::Freezer=变量。我试过用它 添加一个返回“缩短”值的序列化程序方法不会产生任何结果,尽管该方法会被调用。使序列化程序方法作用于$\u0[0]会产生所需的效果,但会破坏原始数据结构 我很困惑。我做错了什么?我怎样才能修好它 下面是一个经过改进的

我正在尝试在一个旧的大型Perl项目中记录数据结构。为了做到这一点,我使用了一些结构,但是,有点太大,垃圾邮件的日志。因此,我正在寻找一种方法,以一种不太冗长的方式记录它们

现在,Dumper的文档提到了可用于修复该问题的
$Data::Dumper::Freezer=
变量。我试过用它

添加一个返回“缩短”值的序列化程序方法不会产生任何结果,尽管该方法会被调用。使序列化程序方法作用于$\u0[0]会产生所需的效果,但会破坏原始数据结构

我很困惑。我做错了什么?我怎样才能修好它

下面是一个经过改进的示例代码:

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Indent = 0;
$\="\n";

my $x = Foo->new ( answer => 42, use => "force" );
my $y = { foo => $x };

print "initial plain:\n\t", Dumper( $x );
print "initial compound:\n\t", Dumper( $y );

{
    local $Data::Dumper::Freezer = 'freeze_pure';
    print "still not abbreviated data:\n\t", Dumper( $y );
};
{
    local $Data::Dumper::Freezer = 'freeze_replace';
    print "abbreviated data:\n\t", Dumper( $y );
};

print "initial data is still intact:\n\t", Dumper( $x );
print "compound data is corrupted:\n\t", Dumper( $y );

package Foo;

sub new {
    my $class = shift;
    return bless { @_ }, $class;
};

sub freeze_pure {
    my $self = $_[0];
    warn "# In freeze_pure";
    return bless { 
        values => join ",", values %$self 
    }, (ref $self) . "::short";
};

sub freeze_replace {
    my $self = $_[0];
    warn "# In freeze_replace";
    $_[0] = bless {
        values => join ",", values %$self 
    }, (ref $self) . "::short";
    return;
};
和输出:

initial plain:
    $VAR1 = bless( {'use' => 'force','answer' => 42}, 'Foo' );
initial compound:
    $VAR1 = {'foo' => bless( {'use' => 'force','answer' => 42}, 'Foo' )};
# In freeze_pure at dumper-freezer.pl line 36.
still not abbreviated data:
    $VAR1 = {'foo' => bless( {'use' => 'force','answer' => 42}, 'Foo' )};
# In freeze_replace at dumper-freezer.pl line 42.
abbreviated data:
    $VAR1 = {'foo' => bless( {'values' => 'force,42'}, 'Foo::short' )};
initial data is still intact:
    $VAR1 = bless( {'use' => 'force','answer' => 42}, 'Foo' );
compound data is corrupted:
    $VAR1 = {'foo' => bless( {'values' => 'force,42'}, 'Foo::short' )};

尽管文档有点稀疏,但冷冻室/烤面包机的预期用途是数据序列化/反序列化,而不是美化调试输出

因此,Data::Dumper调用冻结器方法,但不使用返回值。其思想可能是,如果要序列化对象,在对其进行反序列化之前,不会再对其进行处理,因此更改对象本身没有问题

以下是来自Data::Dumper源的

# Call the freezer method if it's specified and the object has the
# method.  Trap errors and warn() instead of die()ing, like the XS
# implementation.
my $freezer = $s->{freezer};
if ($freezer and UNIVERSAL::can($val, $freezer)) {
  eval { $val->$freezer() };
  warn "WARNING(Freezer method call failed): $@" if $@;
}

如果您只想减少日志中输出的大小,可以通过将
$Data::Dumper::Indent
设置为零来删除换行符和缩进:

use Data::Dumper;
use WWW::Mechanize;

$Data::Dumper::Indent = 0;
my $mech = WWW::Mechanize->new;
print Dumper $mech;
输出:

$VAR1=bless({'headers'=>{},'ssl\u opts'=>{'verify\u hostname'=>1},'forms'=>undef,'page\u stack'=>[],'text'=>undef,'requests\u redirectable'=>['GET','HEAD'POST'],'timeout'=>180,'onerror'=>sub{'DUMMY}“当前表单”=>undef、“链接”=>undef、“最大重定向”=>7、“安静”=>0、“图像”=>undef、'noproxy'=>0、'stack\u depth'=>8675309、'show\u progress'=>undef、'protocols\u forbidden'=>undef、'no\u proxy'=>7、'Handler'>{'request\u prepare'=>bless([{'owner'=>LWP::UserAgent::cookie'>jar'、'callback'=>sub{}\,'line'=>'/home/foo/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/LWP/UserAgent.pm:705'}],'HTTP::Config'),'response_header'=>bless([{'owner'=>'LWP::UserAgent::parse_head','callbackback'=>sub{“DUMMY”},'m_media_type'=>'html','line'=>'/home/foo/perl5/perl5/perlww/perls/perl头文件','perl头文件','callback'=>sub sub{'DUMMY''>'html'>'html'>'m媒体类型','html','html','html'>'m,'HTTP::Config'),'response_done'=>bless([{'owner'=>'LWP::UserAgent::cookie_jar','callback'=>sub{“DUMMY”},'line'=>'/home/foo/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/LWP/UserAgent.pm:708'},'HTTP::Config'),'onwarn'=>sub{“DUMMY”},“允许的协议”=>undef,'use_eval'=>1,'local_address'=>undef,'autocheck'=>1,'title'=>undef,'def_headers'=>bless({'user-agent'=>'WWW-Mechanize/1.75'},'HTTP::headers'),'cookie(COOKIES'=>{},'HTTP::COOKIES'),'proxy'=>{},'max\u size'=>undef,'WWW::Mechanize');
这仍然是一个很大的输出,但它肯定比:

$VAR1=祝福({
'headers'=>{},
“ssl_选项”=>{
“验证主机名”=>1
},
'forms'=>undef,
“页面堆栈”=>[],
“文本”=>未定义,
“请求可重定向”=>[
“得到”,
“头”,
“职位”
],
“超时”=>180,
'onerror'=>sub{“DUMMY”},
“当前形式”=>未定义,
“链接”=>未定义,
“最大重定向”=>7,
“安静”=>0,
“图像”=>未定义,
'noproxy'=>0,
“堆栈深度”=>8675309,
“显示进度”=>未定义,
“禁止使用协议”=>未定义,
“无代理”=>[],
“处理程序”=>{
“请求准备”=>祝福([
{
'owner'=>'LWP::UserAgent::cookie\u jar',
'callback'=>sub{“DUMMY”},
“line'=>”/home/foo/perl5/perlbrew/perls/perl-5.16.3/lib/site\u perl/5.16.3/LWP/UserAgent.pm:705”
}
],'HTTP::Config'),
“响应头”=>祝福([
{
'owner'=>'LWP::UserAgent::parse_head',
'callback'=>sub{“DUMMY”},
'm_media_type'=>'html',
“line'=>”/home/foo/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/LWP/UserAgent.pm:684”
}
],'HTTP::Config'),
“回复完成”=>祝福([
{
'owner'=>'LWP::UserAgent::cookie\u jar',
'callback'=>sub{“DUMMY”},
“line'=>”/home/foo/perl5/perlbrew/perls/perl-5.16.3/lib/site\u perl/5.16.3/LWP/UserAgent.pm:708”
}
],'HTTP::Config')