bashのコマンドでPerlモジュールを見つける

とあるPerlのモジュールがインストールされているか知りたかったので、モジュールの見つけかたを調べてみました。

モジュールを見つける簡単な例

find `perl -e 'print "@INC"'` -name '*.pm' | grep モジュール名

findで探しgrepに渡し、自分の探したいモジュール名を入力します。正直なところ、いまいちわかりづらい部分があります。そのため、少し解説を加えてみます。

perl -e 'print "@INC"'

@INC配列はモジュールのパスが入っています。その配列の中身をprintで表示させています。以下は実際に@INC配列を表示させてみました。

perl -e 'print "@INC"'

/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.20.2
/usr/local/share/perl/5.20.2
/usr/lib/x86_64-linux-gnu/perl5/5.20
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.20
/usr/share/perl/5.20
/usr/local/lib/site_perl

findコマンド

findコマンドは

find ディレクトリ 検索条件

で構成されています。ディレクトリは先ほどPerlで表示させたモジュールパスの一覧が複数並んでいる状態になります。つまり

find /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.20.2...

となっています。最後に検索条件の-nameがついています。ここでは検索パターンを並べてます。*.pmとなっているので.pmがついたファイル全てを表示してくれます。実際にfindで調べた結果の一部を見てみます。

/usr/local/share/perl/5.20.2/LWP/Protocol/file.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/cpan.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/loopback.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/nogo.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/nntp.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/ftp.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/mailto.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/GHTTP.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/https.pm
/usr/local/share/perl/5.20.2/LWP/Protocol/gopher.pm

grepコマンド

一通り.pmのついたファイルを表示させてから、grepにデータを渡してます。grepは表示した結果から欲しい情報だけ表示することができます。例えばDBIxがついたディレクトリを調べたい場合。

 find `perl -e 'print "@INC"'` -name '*.pm' | grep DBIx

/usr/local/share/perl/5.20.2/DBIx/Class/InflateColumn/File.pm
/usr/local/share/perl/5.20.2/DBIx/Class/InflateColumn/DateTime.pm
/usr/local/share/perl/5.20.2/DBIx/Class/Serialize/Storable.pm
/usr/local/share/perl/5.20.2/DBIx/Class/ResultSourceHandle.pm
/usr/local/share/perl/5.20.2/DBIx/Class/Carp.pm
/usr/local/share/perl/5.20.2/DBIx/Class/ResultSet.pm

と、なります。