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是提高文件的可读性,但是有两个命令具有相反的效果,--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

除了其他人的答案,我想建议您阅读 Ovid 关于如何在 Perl 中检测重复代码的文章?还有 更多关于在 Perl 中查找重复代码的信息

于 2013-01-07T18:42:35.350 回答