6

行コメント、空白行などの違いのみを持つ実質的に同一の perl スクリプトを検出できるように、perl スクリプトを縮小したいと考えています。この縮小を行うためのビルド済みスクリプトはありますか? もしそうなら、私は自分で同じファイルをチェックサムして強調表示することができます。

4

4 に答える 4

7

正確に縮小するわけではありませんがB::Deparse、Perlスクリプトをコンパイルしてから、逆コンパイルしてPerlに戻すことができます。

結果を比較できます。

簡単なコマンドラインの例は次のとおりです。

david@Workstation:comp # perl -MO=Deparse 1.pl > a.pl
1.pl syntax OK
david@Workstation:comp # perl -MO=Deparse 2.pl > b.pl
2.pl syntax OK
david@Workstation:comp # diff a.pl b.pl
david@Workstation:comp # diff 1.pl 2.pl
3c3,5
< say "Hello";
---
> 
> 
>   say "Hello";
david@Workstation:comp # 
于 2013-01-07T16:51:20.077 に答える
5

perltidyこのユーティリティを使用して、複数のスクリプト間でフォーマットを「標準化」することを検討してください。

ドキュメントで説明されている「難読化」フラグもあります。

ファイルを読み取れないようにする

の目的はperltidyファイルの読みやすさを向上させることですが、逆の効果を持つ 2 つのコマンド--mangle--extrude. これらは実際には、他のパラメーターの組み合わせのエイリアスにすぎません。これらは両方とも可能なすべての空白を取り除きますが、コメントと pod ドキュメントを残すため、本質的に元に戻すことができます。... perltidy を使用してファイルを再フォーマットできるため、これらのオプションは意味のある難読化を提供しないことに注意してください。

于 2013-01-07T16:57:07.040 に答える
5

Code::CutNPaste重複する Perl コードを見つける

use Code::CutNPaste;

my $cutnpaste = Code::CutNPaste->new(
    dirs         => [ 'lib', 'path/to/other/lib' ],
    renamed_vars => 1,
    renamed_subs => 1,
);
my $duplicates = $cutnpaste->duplicates;

foreach my $duplicate (@$duplicates) {
    my ( $left, $right ) = ( $duplicate->left, $duplicate->right );
    printf <<'END', $left->file, $left->line, $right->file, $right->line;

Possible duplicate code found
Left:  %s line %d
Right: %s line %d

END
    print $duplicate->report;
}
于 2013-01-07T17:23:52.520 に答える
2

他の人の回答に加えて、Perl で重複コードを検出する方法に関する Ovid の記事を読むことをお勧めします。また 、Perl で重複するコードを見つける方法についても詳しく説明しています。

于 2013-01-07T18:42:35.350 に答える