我怎样才能缩小Perl脚本?

时间:2013-01-07 16:46:46

标签: perl minify

我想缩小perl脚本,以便我可以检测几乎完全相同的perl脚本,这些脚本只有行注释,空白行等的差异。我有一个预先构建的脚本来做这个缩小?如果是这样,我将能够自己校验和突出显示相同的文件。

4 个答案:

答案 0 :(得分: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 # 

答案 1 :(得分:5)

考虑使用perltidy实用程序跨多个脚本“标准化”格式。

它甚至有一个'混淆'标志,在文档中有解释:

  

使文件不可读

     

perltidy的目标是提高文件的可读性,但是   有两个具有相反效果的命令,--mangle和   --extrude。它们实际上只是组合的别名   其他参数。这两个都删除了所有可能的空格,但是   留下评论和pod文档,以便它们本质上是   可逆的。   ...   请注意,这些选项不提供任何有意义的混淆,因为perltidy可用于重新格式化文件。

答案 2 :(得分: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;
}

答案 3 :(得分:2)

除了其他人的答案,我建议你阅读Ovid关于how to detect duplicate code in Perl的文章?并且 More on finding duplicate code in Perl