有没有一种安全的方法可以使用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的文档,以便了解这些选项所做的修改。评估仅检索类自身生成的数据,从到数据库的往返除外。评估仅检索类自身生成的数据,从到数据库的往返除外。谢谢,一定会读入保险箱。理论上,除了从数据库中保存/检索数据外,数据是内部的,但更倾向于防御!谢谢,我一定会读进保险箱的。理论上,除了从数据库中保存/检索数据外,数据是内部的,但更倾向于防御!