Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
有没有一种安全的方法可以使用eval在Perl中解压Data::Dumper输出?_Perl_Coding Style_Data Dumper - Fatal编程技术网

有没有一种安全的方法可以使用eval在Perl中解压Data::Dumper输出?

有没有一种安全的方法可以使用eval在Perl中解压Data::Dumper输出?,perl,coding-style,data-dumper,Perl,Coding Style,Data Dumper,我有一个使用冻结数据的对象: sub frozen_data { my $self = shift; $Data::Dumper::Indent = 0; $Data::Dumper::Terse = 1; return Data::Dumper->Dump( [ $self->{_DATA}, ] ); } 以及相应的解冻: sub thaw_data { my ($self) = @_; $self->{_DATA}

我有一个使用冻结数据的对象:

sub frozen_data {
    my $self = shift;

    $Data::Dumper::Indent = 0;
    $Data::Dumper::Terse  = 1;
    return Data::Dumper->Dump( [ $self->{_DATA}, ] );
}
以及相应的解冻:

sub thaw_data {
    my ($self) = @_;

    $self->{_DATA} = eval $self->{DATA};
}
这似乎很有效,有什么问题吗?我还试着运行perlcritic的这个,我得到了:

Expression form of "eval" at line 69, column 22.  See page 161 of PBP.  (Severity: 5)

写这篇文章的更好方法是什么?

如果要解冻Data::Dumper的输出,就没有办法了。另一种选择是


如果您正在接受不可信的输入并将其未经检查地交给eval,则应立即重新设计此机制,因为它会使前门敞开。对于编组内部数据,我不会担心这个警告。

如果要解冻data::Dumper的输出,就没有办法解决这个问题。另一种选择是


如果您正在接受不可信的输入并将其未经检查地交给eval,则应立即重新设计此机制,因为它会使前门敞开。对于编组内部数据,我不会担心这个警告。

您可以通过告诉STFU Perl批评家:

 $self->{_DATA} = eval $self->{DATA}; ## no critic

有时,您需要做的事情通常只是一种不好的做法。

您可以通过告诉STFU Perl批评家:

 $self->{_DATA} = eval $self->{DATA}; ## no critic

有时,您需要做的事情通常是不好的。

只要您知道该数据的唯一来源是您自己使用Dumper创建的冻结数据,就可以了


另一种方法是使用Dumper以外的其他工具,例如。

只要您知道该数据的唯一来源是您自己使用Dumper创建的冻结数据,就可以了


另一种选择是使用非自卸车,例如。

决定要允许或禁止哪些内容并设置一个隔间,然后使用它的reval方法。

决定要允许或禁止哪些内容并设置一个隔间,然后使用它的reval方法。

对于查看此内容并想知道是否要滚动自己的序列化的人,查看这篇博客文章可能会获得一些好处,其中比较了几个现有序列化程序的列表,并给出了每个序列化程序的一些优缺点:

他提到了Data::Dumper、Storable、YAML::XS、Data::Dump、XML::Dumper、JSON::XS、JSYNC和freezeaw。他总结说,所有这些都缺少一些特征:

总之,选择是好的,但我还没有找到我完美的将军 序列化模块还没有。我的两个最爱是Storable和YAML::XS。 如果JSYNC[更快并且支持Regexp,或者如果YAML::XS或YAML::Syck [可以]输出内联/紧凑YAML,这将和我一样接近完美 我想要它

还可以看到人们在评论中提出的观点。能从以前遇到过问题的人的角度来看问题是很好的

如果您正在进行自己的序列化,您可能希望了解其中提到的优点和缺点—速度、处理正则表达式和循环引用等方面的能力。这可能会避免您没有意识到可能会遇到的问题

另外,当您使用转储程序进行序列化时,最好了解Data::Dumper为输出提供的所有选项

它是否会进入一个数据库,在这个数据库中,将来某个时候,有人会希望使用类似的模式执行SQL查询?如果是这样的话,您会很高兴使用排序键,因为这样您就可以像“%akey=front%ckey=front\u of_c%”这样做,并且您只需要担心一个排序,而不是n个阶乘

举个例子,我的一个朋友使用Dumper进行序列化:

my $deflated = Data::Dumper->new([$data])->Purity(1)->Terse(1)->Deepcopy(1)->Sortkeys(1)->Indent(1)->Dump;

我建议您阅读Dumper的文档,这样您就可以了解这些选项所做的修改。

对于那些正在查看此文档并想知道是否要进行自己的序列化的人,查看这篇博客文章可能会获得一些好处,其中比较了几个现有序列化程序的列表,并给出了每个序列化程序的一些优缺点:

他提到了Data::Dumper、Storable、YAML::XS、Data::Dump、XML::Dumper、JSON::XS、JSYNC和freezeaw。他总结说,所有这些都缺少一些特征:

总之,选择是好的,但我还没有找到我完美的将军 序列化模块还没有。我的两个最爱是Storable和YAML::XS。 如果JSYNC[更快并且支持Regexp,或者如果YAML::XS或YAML::Syck [可以]输出内联/紧凑YAML,这将和我一样接近完美 我想要它

还可以看到人们在评论中提出的观点。能从以前遇到过问题的人的角度来看问题是很好的

如果您正在进行自己的序列化,您可能希望了解其中提到的优点和缺点—速度、处理正则表达式和循环引用等方面的能力。这可能会避免您没有意识到可能会遇到的问题

另外,当您使用转储程序进行序列化时,最好了解Data::Dumper为输出提供的所有选项。

它是否会进入一个数据库,在这个数据库中,将来某个时候,有人会希望使用类似的模式执行SQL查询?如果是这样的话,您会很高兴使用排序键,因为这样您就可以像“%akey=front%ckey=front\u of_c%”这样做,并且您只需要担心一个排序,而不是n个阶乘

举个例子,我的一个朋友使用Dumper进行序列化:

my $deflated = Data::Dumper->new([$data])->Purity(1)->Terse(1)->Deepcopy(1)->Sortkeys(1)->Indent(1)->Dump;

我建议您阅读Dumper的文档,以便了解这些选项所做的修改。

评估仅检索类自身生成的数据,从到数据库的往返除外。评估仅检索类自身生成的数据,从到数据库的往返除外。谢谢,一定会读入保险箱。理论上,除了从数据库中保存/检索数据外,数据是内部的,但更倾向于防御!谢谢,我一定会读进保险箱的。理论上,除了从数据库中保存/检索数据外,数据是内部的,但更倾向于防御!