Me he encontrado con este problema yo mismo en el pasado. Hice un pequeño y rápido programa que usa PPI para encontrar subrutinas. Normaliza el código un poco (espacio en blanco normalizado, comentarios eliminados) e informa cualquier duplicado. Funciona razonablemente bien. PPI hace todo el trabajo pesado.
usted podría hacer la normalización un poco más inteligente mediante la normalización de los nombres de las variables en cada rutina de $ a, $ b, $ c y tal vez hacer algo similar para las cadenas. Depende de qué tan agresivo quieras ser.
#!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;
}
}
}
No estoy exactamente seguro de lo que quieres decir cuando dices "redundante". ¿Estás hablando de múltiples subs que hacen el mismo trabajo? ¿O sobre submarinos que nunca se llaman? ¿O ambos? – innaM