Ich habe in der Vergangenheit selbst auf dieses Problem gestoßen. Ich habe ein kleines Programm zusammengestellt, das PPI benutzt, um Subroutinen zu finden. Es normalisiert den Code ein wenig (Leerzeichen normalisiert, Kommentare entfernt) und meldet alle Duplikate. Funktioniert einigermaßen gut. PPI macht das ganze schwere Heben.
Sie könnten die Normalisierung etwas schlauer machen, indem Sie alle Variablennamen in jeder Routine auf $ a, $ b, $ c normalisieren und vielleicht etwas ähnliches für Strings tun. Hängt davon ab, wie aggressiv du sein willst.
#!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;
}
}
}
Ich bin mir nicht sicher, was Sie meinen, wenn Sie "redundant" sagen. Sprechen Sie über mehrere Subs, die alle den gleichen Job machen? Oder über Subs, die nie aufgerufen werden? Oder beides? – innaM