1

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

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)

写这个更好的方法是什么?

4

5 回答 5

8

你可以通过将 Perl Critic 告诉 STFU 来解决它 :)

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

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

于 2010-01-07T22:28:56.583 回答
5

如果您要解冻 Data::Dumper 的输出,则无法解决。另一种方法是Storable

如果您接受不受信任的输入并将它们未经检查地交给eval,则应立即重新设计此机制,因为它使前门大开。对于编组内部数据,我不会发出警告。

于 2010-01-07T22:26:32.620 回答
5

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

另一种方法是使用 Dumper 以外的东西,例如Storable

于 2010-01-07T22:29:14.820 回答
5

决定你想要允许或禁止什么,并设置一个安全隔间并使用它的 reval 方法。

于 2010-01-07T22:33:32.247 回答
0

对于任何看到这个并想知道是否推出自己的序列化的人,通过查看这篇博客文章可能会获得一些好处,该文章比较了几个现有序列化器的列表并给出了每个序列化器的一些优点和缺点:

http://blogs.perl.org/users/steven_haryanto/2010/09/comparison-of-perl-serialization-modules.html

他提到了 Data::Dumper、Storable、YAML::XS、Data::Dump、XML::Dumper、JSON::XS、JSYNC 和 FreezeThaw。他得出的结论是,所有这些都缺少一些功能:

总之,选择是好的,但我还没有找到我完美的通用序列化模块。我最喜欢的两个是 Storable 和 YAML::XS。如果 JSYNC [was] 更快并且支持 Regexp,或者如果 YAML::XS 或 YAML::Syck [可以] 输出 inline/compact YAML,那将是我想要的接近完美。

另请参阅人们在评论中提出的观点。了解以前遇到问题的人的观点是件好事,等等。

如果您正在滚动自己的序列化,您可能想看看那里提到的优缺点(速度、处理正则表达式和循环引用等问题的能力等)。这可能会阻止您没有意识到自己可能会遇到的问题。

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

它是否进入数据库,在未来的某个时间,有人想要使用 LIKE 模式进行 SQL 查询?如果是这样,你会很高兴你使用了 Sortkeys,因为你可以做 LIKE '%akey=front%ckey=front_of_c%' 并且你只需要担心一个排序而不是 n 阶乘。

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

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

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

于 2015-04-09T04:27:07.017 回答