Я сам сталкивался с этой проблемой в прошлом. Я собрал небольшую быструю программу, которая использует PPI для поиска подпрограмм. Он немного нормализует код (нормализованы пробелы, удалены комментарии) и сообщает о любых дубликатах. Работает достаточно хорошо. PPI выполняет всю тяжелую работу.
Вы можете сделать нормализацию немного умнее, нормализуя все имена переменных в каждой подпрограмме до $ a, $ b, $ c и, возможно, делая что-то похожее для строк. Зависит от того, насколько агрессивным ты хочешь быть.
#!perl
use strict;
use warnings;
use PPI;
my %Seen;
for my $file (@ARGV) {
my $doc = PPI::Document->new($file);
$doc->prune("PPI::Token::Comment"); # strip comments
my $subs = $doc->find('PPI::Statement::Sub');
for my $sub (@$subs) {
my $code = $sub->block;
$code =~ s/\s+/ /; # normalize whitespace
next if $code =~ /^{\s*}$/; # ignore empty routines
if( $Seen{$code} ) {
printf "%s in $file is a duplicate of $Seen{$code}\n", $sub->name;
}
else {
$Seen{$code} = sprintf "%s in $file", $sub->name;
}
}
}