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

あなたはPerlCriticにSTFUに伝えることによってそれを回避します:)

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

時々、あなたは一般的に悪い習慣に過ぎないことをする必要があります。

于 2010-01-07T22:28:56.583 に答える
5

何を許可または禁止するかを決定し、安全なコンパートメントを設定して、その再評価方法を使用します。

于 2010-01-07T22:33:32.247 に答える
5

Data :: Dumperからの出力を解凍している場合、それを回避する方法はありません。別の方法は保存可能です。

信頼できない入力を受け入れ、それらをチェックせずにに渡す場合evalは、正面玄関が大きく開いたままになるため、このメカニズムをすぐに再設計する必要があります。内部データをマーシャリングするために、私は警告を発汗させません。

于 2010-01-07T22:26:32.620 に答える
5

そのデータの唯一のソースが、Dumperを使用して自分で作成した凍結データであることがわかっている限り、問題はありません。

別の方法は、StorableなどのDumper以外のものを使用することです。

于 2010-01-07T22:29:14.820 に答える
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について言及しています。彼は、それらすべてに欠けている機能があると結論付けています。

結論として、選択は良いですが、私はまだ完璧な一般的なシリアル化モジュールを見つけていません。私の2つのお気に入りは、StorableとYAML::XSです。JSYNCがより高速でRegexpをサポートしている場合、またはYAML::XSまたはYAML::Syckがインライン/コンパクトYAMLを出力する場合、それは私が望むほど完璧に近いでしょう。

コメントで人々が作ったポイントも参照してください。以前に問題に遭遇したことのある人などの視点を得るのは良いことです。

独自のシリアル化を行う場合は、そこに記載されている長所と短所(速度、正規表現や循環参照などを処理する能力など)を確認することをお勧めします。これにより、遭遇する可能性が高いことに気付いていない問題が発生する可能性があります。

また、シリアル化にDumperを使用している場合は、Data::Dumperが出力に提供するすべてのオプションを理解しておくとよいでしょう。

将来、誰かがLIKEパターンでSQLクエリを実行したいと思うデータベースに入るのでしょうか。もしそうなら、Sortkeysを使用したことをうれしく思います。なぜなら、LIKE'%akey = front%ckey = front_of_c%'を実行でき、n階乗の代わりに1つの順序しか気にしないからです。

例として、私の友人が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 に答える