何となく触ってみるPerl - モジュール編

perl_thumbnail Perl

Perlでは外部モジュールを利用するのにCPANを利用します。モジュールのインストールで管理者権限が必要ならばlocal::libを利用すれば、管理者権限が必要ない場所にモジュールをインストールすることもできます。

また、この記事で利用しているPerlのバージョンはv5.32.1になります。

何となく触ってみるPerl - コマンドラインと組み込み変数・関数編
PerlのコードはPythonやRuby等の他のプログラミング言語より前提とする知識が必要に思います。特に変数が特徴的だったり、構文が特徴的だったり($_がよく利用されたり省略されたり)します。少し見てどういうコードなんだろうとよく思うので...
何となく触ってみるPerl - 変数とリファレンス編
Perlの変数は他のプログラミング言語より特徴的な形をしています。変数が変数の識別子のように扱えるリファレンスもとても特徴的な機能です。他にもダイヤモンド演算子(<>)はPerlのコードであればよく見るもので使いこなすことができ...

スポンサーリンク

CPANからモジュールをインストール

CPANを利用するときに必要な外部ツールとして以下のものが必要になる場合があります。

  • make
  • gcc
  • g++
  • unzip
  • curl / wget / ftp

makeは必要になるため、あらかじめインストールしておく必要があります。
また、CPANのモジュールがC言語で書かれているものもあるため、C言語のコンパイラもあらかじめインストールしておく必要があります。
unzipやcurl等のツールは有名なLinuxディストリビューションでは基本的に標準で入っている場合が多いですが、環境にない場合はインストールしておきましょう。

まず始めに、CPANからのモジュールのインストールで管理者権限が必要がなくなるようにlocal::libを利用したCPANのモジュールインストール方法を記述します。

これは、CPANからのダウンロード自体には管理者権限は必要ありませんが、パッケージのインストール先のディレクトリに管理者権限が必要なディレクトリへのインストールを行う場合があります。なので、local::libを用いて、このインストール先のディレクトリを変更し、変更したディレクトリからPerlでモジュールが利用できるような環境変数の生成を実行します。
この実行を~/.bash_profileや~/.bashrcに書き込んで設定完了になります。

local::lib自体のインストールにCPANを利用できない(ダウンロードではCPANを利用します)都合上、自分でmakeを用いて、インストールする手間はありますが、モジュールのインストールを管理者権限なしで利用できる利点を考えると最初にやっておいて損はないと思います。

おすすめのモジュールとしてApp::cpanminusがおすすめで、cpanmコマンドが利用でき、モジュールのインストール等がcpanに比べより便利になります。

App::cpanminusをインストールするとcpanmコマンドで利用できるようになり、以下のようなコマンドでcpanコマンドの代わりにモジュールをインストールできます。

 

 

 

モジュールの利用(ライブラリの利用・ライブラリ検索パス)

Perlモジュールを利用する場合、ファイル拡張子は.pmになります。

ライブラリの検索パスは環境変数PERL5LIBを利用します。環境変数PERL5LIBがない場合は環境変数PERLLIBが利用されます。
プログラム中に検索パスを入れる場合はuse lib文を利用できます。

モジュールは基本的にuse文を利用しインポートして使用します。

これらの文はそれぞれ以下の文と等価になります。

ライブラリを利用するときは、use文はBEGIN文に置き換わるので、require文よりuse文の方が推奨されます。

 

 

 

オブジェクト指向プログラミング

perlでオブジェクト指向プログラミングを行う場合は、クラスとしてパッケージを利用します。
さらにオブジェクトのリファレンスを得るためにbless関数を利用します。

bless関数はリファレンスとクラスの名前(パッケージの名前)を関連付けます。
REFはリファレンスで、CLASSNAMEは文字列になります。
返却値は便宜上のためにREFが返されます。

つまり、perlでのオブジェクト指向プログラミングは以下のようになります。

main.pl

ExampleClass.pm

実行結果

ExampleClass.pmについて、コンストラクタのnew関数では、$classnameは文字列の'ExampleClass'が取得できます。これは、

で、new関数の引数が

のように渡されるからです。ここで第1引数のExampleClassはベアワードで解釈としては文字列になります。

new関数内のその次の処理はbless関数のために空のハッシュリファレンスを作成して、空のハッシュのリファレンスとクラスを関連付けています。最後にそのリファレンスを返却しています。

ExampleClass.pmについて、メソッドのprint関数のshift関数で渡されるものについて、まず、例えば、main.plでは

のように呼び出されています。print関数の引数は

のように渡されます。第1引数の$objはリファレンスで、そのオブジェクト自身のリファレンスになります。
ここでは、そのリファレンスを活用していませんが、引数から受け取ったリファレンスを利用することでオブジェクトデータの操作ができます。

また、ExampleClass.pmの最後の'1;'の行の意味はtrue(真)の値を返す意味になります。これはモジュールは最後にtrueの値を返す必要があるという約束事みたいなものになります。

これだけではオブジェクト指向プログラミングとしては、かなり不完全なものとなります。例えば、上の説明では継承やアクセス権等がありません。また、Perlのオブジェクト指向プログラミングを実現するための便利モジュールとして、ドキュメントでは、MooseモジュールやMooモジュールが紹介されています。

補足として、実行の際に使用したperlのコマンドラインオプションのIオプションでライブラリの検索パスを追加できます。検索パスの追加方法としてmain.plのインポート方法を

のように修正して実行する方法もあります。

 

 

 

モジュールの利用(自作モジュールの作成)

かなり簡略化した形で自作モジュールで作成したいと思います。手探りで試してみたものなので間違っている点があるかもしれませんがご了承ください。

ここでは、perlに付属されているh2xsというツールを使って、モジュールのひな形を作り、プログラムを記述し、簡単なテストコードを書いて、インストールを行って、Perlのコマンドラインでモジュールを呼び出したいと思います。

つまり、ここでのモジュール作成の目標は以下のように呼び出せるようにしてみることになります。

始めに、h2xsコマンドを用いて、モジュールのひな形を作成します。

-nオプションでモジュールの名前を指定します。

このコマンドを実行したら、以下のように実行され、カレントディレクトリにモジュールのひな形が作られます。

次に作成されたディレクトリに移動します。

作成されたディレクトリにあるlib/がプログラムを記述するソースコードがある場所になります。
lib/Mylib/Mymod.pmの'1;'の行の上に以下の行を追記します。

'1;'はモジュールの終わりにtrue(真)の値を返す約束事になります。
また、=head1等があるかもしれませんが、これはPerlのPOD(Plain Old Document)というもので、ドキュメント作成に利用されるPerl用のマークアップ言語になります。

use文が用いられると自動的にimport関数が呼び出されます。$0は実行したプログラム名が入りますが、コマンドラインで実行するときにモジュールのみをインポートし引数を渡さなかった場合は'-'になります。

t/はテストファイルを置くディレクトリになります。ここではdata_check.tとして新しくテストファイルを作成します。
ここでのテストは簡単にテキストデータが意図したものかを確認してみるとします。

t/data_check.t

ソースコードとテストコードが書き終わったら、makeを行います。ドキュメントなども作成したほうが良いかもしれませんがここでは省略します。

makeの手順は

になります。

make testで失敗したら、ソースコードまたはテストコードを書き直して、再びmake testを行います。
また、make install時にlocal::libの設定を行っていない場合は、管理者権限が必要なディレクトリにインストールすることになり、sudo make installのようにしなければいけないかもしれません。

うまくインストールされたらコマンドラインで実行してみて、正しく実行されたら終了となります。

 

 

 

プラグマ

Perlの機能を細かく制御したい場合は、'use'のキーワードを用いてプラグマを利用します。逆に利用したくない場合は'no'のキーワードを用います。
プラグマの効果はブロックの終わりまで続きます。
よく利用されるものとして、strictやwarnings等があります。

strictはデバッグが行いにくい表現を制限するプラグマになります。strictの宣言は以下のものがあります。

'use strict'の場合は、"vars", "refs", "subs"のすべての効果を持つ宣言になります。

それぞれ制限されエラーになる表現は
vars: 明示的に宣言されていない変数の利用時に実行時エラー
refs: シンボリック参照の利用時に実行時エラー
subs: 関数なのか文字列なのかがあいまいになるベアワードの利用時に実行時エラー
になります。

例えば、それぞれのエラーが出る場合は以下のようなものになります。
use strict 'vars'の場合

use strict 'refs'の場合

use strict 'subs'の場合

 

warningsはオプションになっている注意を表示できるプラグマになります。また、warningsのカテゴリは多くあるので詳しくは公式ドキュメントを参照してください。
例えば、注意は以下のような文で表示できます。

 

'use feature'のプラグマは新しい機能を有効にするプラグマになります。既存のプログラムに対して、新しい機能へのリスクを抑えることができるプラグマになります。
例えば、

とすると、改行を入れてくれるprint文としてsay関数が利用可能になります。他にも

とし、Perlのバージョンの5.10の機能を設定することもできます。

 

'use VERSION'のプラグマの

は、

を暗黙的に行います。

 

 

 

参考

perlの公式サイト
The Perl Programming Language - www.perl.org

CPANの公式サイト
The Comprehensive Perl Archive Network - www.cpan.org

metacpan - CPANモジュールの検索サイト
Search the CPAN - metacpan.org

perlのドキュメントを日本語に翻訳しているサイト
perldoc.jp

Perlのオブジェクト指向プログラミングについてのより詳しい説明はPerlのドキュメントの
perlootut - Object-Oriented Programming in Perl Tutorial - Perldoc Browser
perlobj - Perl object reference - Perldoc Browser

warningについて(カテゴリ等も書かれています)
warnings - Perl pragma to control optional warnings

perlのモジュールについて(プラグマについてはPragmatic Moduleを参考)
更にモジュールの詳しい情報を調べたい場合は、公式ドキュメントのページ内検索を用いるとよいでしょう。
perlmodlib - constructing new Perl modules and finding existing ones

コメント