前回の
Perlの静的解析ツール
(2)
Perl::Critic── コーディング規約のチェッカー
Perl::Criticは、
使い方
Perl::Criticの基本的な使い方は次のとおりです。
use Perl::Critic;
my $critic = Perl::Critic->new();
print $critic->critique('/path/to/file.pl');
Perl::Criticのインスタンスメソッドであるcritique
の引数にチェックしたいファイルを指定すると、
たとえば次のようなソースコードに対してPerl::Criticを適用すると警告が出ます。
open my $fh, "<$filename";
# => Two-argument "open" used at line 8, column 1. See page
207 of PBP.
Perl::Criticを用いると、
応用例
このようにPerl::Criticで警告が出るコードは品質に劣るケースがあります。これを効率的に検出するために、
Perl::CriticはPPIで実装されていることに加え、
Perl::PrereqScanner(::Lite)── 依存モジュールの抽出
Perl::PrereqScannerは、
登場の背景
プロジェクトの開発を進めていくうえで外部のCPANライブラリを利用することは多々あると思いますが、use
やrequire
しているか)
新しいモジュールをプロジェクトに取り入れた段階で、
使い方
Perl::PrereqScannerの基本的な使い方は次のとおりです。
use Perl::PrereqScanner;
my $scanner = Perl::PrereqScanner->new();
my $prereqs = $scanner->scan_file('/path/to/file.pl');
たとえば次のようなファイルを上記のプログラムで解析すると、
use Acme;
require Acme::Buffy;
use Moose;
extends 'Acme::Colour'; # Moose における継承の記法
no Moose;
bless( {
bad_version_hook => undef,
requirements => {
Acme => bless( {
minimum => bless( {
original => 0,
version => [
0
]
}, 'version' )
}, 'CPAN::Meta::Requirements::_Range::Range' ),
"Acme::Buffy" => bless( {
minimum => bless( {
original => 0,
version => [
0
]
}, 'version' )
}, 'CPAN::Meta::Requirements::_Range::Range' ),
"Acme::Colour" => bless( {
minimum => bless( {
original => 0,
version => [
0
]
}, 'version' )
}, 'CPAN::Meta::Requirements::_Range::Range' ),
Moose => bless( {
minimum => bless( {
original => 0,
version => [
0
]
}, 'version' )
}, 'CPAN::Meta::Requirements::_Range::Range' )
}
}, 'CPAN::Meta::Requirements' )
Perl::PrereqScannerのインスタンスメソッドであるscan_*()
は上記のようにCPAN::Meta::Requirementsのオブジェクトを返却してくるので、scan_
など)scanprereqs-cpanfile
の実行結果を示します。
$ scan-prereqs-cpanfile
requires 'Acme';
requires 'Acme::Buffy';
requires 'Acme::Colour';
requires 'Moose';
Perl::PrereqScanner::Lite──高速化版Perl::PrereqScanner
Perl::PrereqScannerは便利ですが、
App::PRT── リファクタリングツール
App::PRTはPerlコードのためのリファクタリングツールです。PRTは
sedを用いたリファクタリング
Perlのリファクタリングと言えばsedなどのツールを使って正規表現で一括置換といった方法が一般的でしたが、
簡単な例ですが次のようなプログラムがあったとして、$blog
というハッシュリファレンスのid
というキーをarticle_
にリネームしたいとしましょう。
my $blog = shift;
print $blog->{id};
print $blog->{user_id};
sedで単純にリネームすると次のようになると思います。
$ sed -e "s/id/article_id/g" script.pl
しかしこれではid
というキーだけではなくuser_
というキーに含まれるid
という部分にも影響が及んでしまい、
my $blog = shift;
print $blog->{article_id};
print $blog->{user_article_id};
prtを用いたリファクタリング
そこで登場するのがApp::PRTです。App::PRTをインストールすると一緒に入ってくるコマンドラインツールprtを利用することで、replace_
を使うと望みの処理を実現できます。
$ prt replace_token id article_id script.pl
第一引数のreplace_
はid
というトークンにのみ置換が働いてarticle_
に変更できます。以下は、
my $blog = shift;
print $blog->{article_id};
print $blog->{user_id};
App::PRTは内部的にPPIを使っており、
App::PRTはまだ若いプロジェクトなので、
<続きの