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