2012-09-05 7 views
16

Pythonの場合、不要なimport文があるかどうかを示すimportcheckerというスクリプトがあります。Perlスクリプトで不要な使用ステートメントをチェックするツールはありますか?

Perl use(およびrequire)の文にも同様のユーティリティがありますか?

+0

perlcriticがその機能を持つ可能性があります。 – ikegami

+1

解決策は100%正確ではないことに注意してください。 'use Module;'は偽陰性である可能性があります。 '厳密なqw(refs)を使う;'は偽陽性である可能性があります。 'モジュールを使用するqw(:ALL);'は偽陰性と偽陽性の可能性があります。 – ikegami

+0

関連する質問:http://www.perlmonks.org/?node_id=780433 – toolic

答えて

5

Devel::TraceUseをご覧ください。あなたが探しているもののチャンクを与えるかもしれません。

+0

それは私に何がロードされているかを示すようです。私は何がロードされているか知っていますが、使用されていません。 –

+0

静的コード分析、または実行時分析をしますか? –

+0

スタティックコード解析。 –

3

これを試すには、script I wroteがあります。それは非常に単純化され、あなたのために何かを自動化することはありませんが、それはあなたに始める何かを与えるでしょう。

#!/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

perl v5.12.2でこのコードを実行しようとすると、コンパイルエラーが発生します。プッシュするarg 1の型は、unused.pl行の " - >リテラル"の近くの配列(ハッシュ要素ではありません)でなければなりません " – toolic

+1

https://metacpan.org/release/Perl-Critic-StricterSubsを拡張するための素敵な出発点かもしれません – toolic

+0

プッシュ配列リファレンスには実際に5.14が必要です。 – stu42j

関連する問題