我想缩小一个 perl 脚本,这样我就可以检测到几乎相同的 perl 脚本,它们只有行注释、空行等方面的差异。我有一个预先构建的脚本来做这个缩小吗?如果是这样,我将能够自己校验和并突出显示相同的文件。
问问题
2150 次
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 回答