2012-09-05 1 views
16

Pour Python, il existe un script appelé importchecker qui vous indique si vous avez des instructions inutiles import.Y at-il un outil pour vérifier un script Perl pour les instructions d'utilisation inutiles?

Existe-t-il un utilitaire similaire pour les instructions Perl use (et require)?

+0

perlcritic pourrait avoir cette fonctionnalité. – ikegami

+1

Notez qu'aucune solution ne serait précise à 100%. 'use Module;' pourrait être un faux négatif. 'use strict qw (refs);' pourrait être un faux positif. 'use Module qw (: ALL);' pourrait être un faux négatif et un faux positif. – ikegami

+0

Question connexe: http://www.perlmonks.org/?node_id=780433 – toolic

Répondre

5

Jetez un oeil à Devel::TraceUse cela pourrait vous donner une bonne partie de ce que vous cherchez.

+0

Cela semble me montrer ce qui est chargé. Je veux savoir ce qui est chargé mais pas utilisé. –

+0

Voulez-vous une analyse de code statique ou une analyse d'exécution? –

+0

Analyse de code statique. –

3

Voici un script I wrote pour tenter cela. C'est très simpliste et n'automatisera rien pour vous, mais ça vous donnera quelque chose pour commencer.

#!/usr/bin/perl 

use strict; 
use v5.14; 

use PPI::Document; 
use PPI::Dumper; 
use PPI::Find; 
use Data::Dumper; 

my %import; 
my $doc = PPI::Document->new($ARGV[0]); 

my $use = $doc->find(sub { $_[1]->isa('PPI::Statement::Include') }); 
foreach my $u (@$use) { 
    my $node = $u->find_first('PPI::Token::QuoteLike::Words'); 
    next unless $node; 
    $import{$u->module} //= []; 
    push $import{$u->module}, $node->literal; 
} 

my $words = $doc->find(sub { $_[1]->isa('PPI::Token::Word') }); 


my @words = map { $_->content } @$words; 

my %words; 
@words{ @words } = 1; 

foreach my $u (keys %import) { 
    say $u; 
    foreach my $w (@{$import{$u}}) { 
     if (exists $words{$w}) { 
      say "\t- Found $w"; 
     } 
     else { 
      say "\t- Can't find $w"; 
     } 
    } 
} 
+1

Je reçois une erreur de compilation quand j'essaye d'exécuter ce code sur perl v5.12.2: 'Le type d'argument 1 à pousser doit être array (pas d'élément hash) sur la ligne unused.pl, près de" -> literal; "' – toolic

+1

pourrait être un bon point de départ pour étendre https://metacpan.org/release/Perl-Critic-StricterSubs – toolic

+0

Il devrait effectivement exiger 5.14 pour le push arrayref. – stu42j

Questions connexes