2017年 Perl5 との戦いに生き残るための最高の開発環境を手に入れる

More than 1 year has passed since last update.


はじめに:これは誰のための記事か?


  • Perl で書かれた比較的大きなスクリプトやプロジェクトを保守する必要のある人.


Perl 5 との戦い

Perl5 (以下 Perl) といえば一時期 CGI を作るための標準的な技術として Web の開発で利用されたり、テキスト処理用の言語として昔から広く使用されている言語です。

かつてはサーバー上で CGI を動作させるために Perl でなければならない というような状態がありましたが、近年では Ruby on Rails や PHP 製のフレームワークなどがサーバー上で普通に利用できるようになっており、かつてのような Perl が必要とされる ようなシチュエーションは減ってきているかと思います。

また、オブジェクト指向プログラミングや関数型プログラミングをサポートする新しい言語が普及してきている現在では、新規の開発に Perl を採用するメリットも (既存モジュールが Perl で書かれている あるいは Perl 大好き! な人でない限り) 少なくなってきているのではないかと思われます。

しかし、Perl で書かれたプログラムはまだまだ様々な場所で利用されていることから、保守作業のために Perl を読まなければならない シチュエーションには当面の間は対応し続けなければならないでしょう。

自分の周りだけかもしれませんが、どうも Perl は テキストエディタで開発を行う言語 として認識されているような感があります。しかしながら、ある程度以上の大きさのコードをメンテナンスしなければならないとなると、やはり他の言語のように IDE の導入を考えたいところです。IDE の導入により、GUI 上でのデバッガの活用やリファクタリング、Git でのバージョン管理などが IDE 上で一括して管理できるようになります。

Perl の開発で利用できる IDE がないのか調べてみますと、Padre という IDE や Eclipse 用のプラグインである EPIC などが存在しているようです。Padre は現在 公式サイト で macOS 用のバイナリがリンク切れとなっており、Homebrew でも提供されていないため、普段 macOS を扱っている自分にはちょっと利用できそうにないです...。 また、こちら では macOS 上では日本語入力ができないという問題も報告されています。

EPIC は試してはいないのですが、なんだか導入が面倒くさそう...(偏見)

しかし IDE を使わないとなると、昔ながらのテキストエディタを用いたコーディングを行わざるを得ません。ただでさえ Perl のコードは $$@% などの記号を多用する黒魔術的なコードであり、Perl に慣れている人でなければ読み解くのが困難になりがちです。

また、既存のコードを動作を確認するのにデバッガを使おうとしても、シェル上からデバッガを起動させる必要があるため、IDE のように気軽に変数の状態を確認することができません。IntelliJ IDEA のようなモダンな IDE を知っている身からすると、これは耐え難い苦痛です。

このままでは (僕が) Perl に殺されてしまう... なんとかならんのか...

と、思っていた矢先に Perl for IntelliJ IDEA なる JetBrains 社製 IDE 用のプラグインを見つけました。また、これに Devel::Camelcadedb という Perl モジュールを組み合わせることで、JetBrains 社製 IDE 上で Perl の開発がかなり快適に行えるということがわかりました。 JetBrains 社製 IDE でおなじみのあの デバッグ 機能も使えます!

この記事では、順を追って Perl 用の IDE 開発環境を構築する方法について説明していきます。

この記事では macOS Yosemite の画面をベースに解説しますので、macOS 以外の方は適宜読み替えるようにお願いします。

なお、この記事で構築する開発環境は恐らく Perl 6 には対応していません。 ごめんなさい。


IntelliJ IDEA Community Edition をインストールする

まずは JetBrains 社製の IDE のインストールを行いましょう。既に何らかの IDE を使用されている方はこのステップは飛ばしてもらって構いません。ただし、導入するプラグインが使用している IDE の Build バージョンに対応していない可能性もあるため、できる限り IDE を最新版に更新しておくことをオススメします。

JetBrains 社は IntelliJ IDEA に代表される様々な言語の IDE を開発・販売している チェコ の会社です。

しかし、意外と知られていないのかもしれませんが、JetBrains 社の Java 用 IDE である IntelliJ IDEA と Python 用 IDE である PyCharm には Community Edition と呼ばれる無償版が存在します。

したがって、Perl 用の開発環境は Community Edition のいずれかをインストールすることで 無償で 構築できます。

ここでは IntelliJ IDEA Community Edition 2016.3.3 (以下、IntelliJ IDEA) を例にインストールを行っていきます。

(なお、JetBrains 社は学生向けには 全てのプロダクトが無償で利用できる 1 年間のライセンス毎年 発行しており、学生は 実質無料で JetBrains 社の全てのプロダクトを利用することができるようになっています。 学生は ac.jp で終わるメールアドレスを登録あるいは学生証のスキャンデータを送信することでこの無償ライセンスを毎年取得できるので積極的に活用していくのが良いでしょう。登録は こちら 。)

まずは、IntelliJ IDEA を https://www.jetbrains.com/idea/ からダウンロードしましょう.

ページをスクロールし、ページの最下部にある Download ボタンからインストーラをダウンロードできます。

01_ダウンロード001.png

ダウンロードが完了したらインストーラを実行して IntelliJ IDEA をインストールしましょう。macOS では Applications ディレクトリにファイルをコピーするだけでインストール完了となります。

01_ダウンロード002.png

なお、IntelliJ IDEA は標準では日本語化されていませんが、有志の方が 日本語化ファイル を公開してくれています。日本語化する場合は こちら を参考にされるとよいかと思います。ただし、日本語化ファイルがこの先メンテナンスされるとは限らないので、英語のままで OK という場合にはそのまま使用されたほうがよいかもしれません。


IntelliJ IDEA を起動し、プラグインを導入する

インストールが完了したら早速 IntelliJ IDEA を起動しましょう。

最初に初期設定を行うためのセットアップウィンドウが表示されると思いますが、基本的にはそのままデフォルト設定で大丈夫かと思います。外観のテーマやプラグインのインストールなどの作業は必要に応じて各自行うようにしてください。初期設定が完了すると、以下のようなウィンドウが表示されるはずです。( これ以降の説明では外観のテーマを Darcula に設定したスクリーンショットを示します。)

02_プラグイン001.png

初期設定が完了したら、次に Perl 開発をサポートするためのプラグインのインストールを行います。ブラウザから https://plugins.jetbrains.com/idea/plugin/7796-perl にアクセスし、以下の場所から最新版の Perl for IntelliJ IDEA プラグインをダウンロードしてください。この記事では 2017 年 1 月現在、最新のバージョンである 2016.3.1_8 というバージョンを使用します。(これ以外のバージョンでは動作確認は行っていません。)

なお、このプラグインの公式リポジトリは https://github.com/Camelcade/Perl5-IDEA となっています。設定で困ったときなどには、このリポジトリの Wiki ページを参照すると良いでしょう。

02_プラグイン002.png

プラグインをダウンロードする際、COMPATIBLE BUILDS に示されている Build 番号が使用している IDE の Build 番号に該当しているかを確認しておいて下さい。(対応していない Build 番号の IDE にインストールしようとすると、エラーが発生してしまいます。)

IntelliJ IDEA の場合、IntelliJ IDEA -> About IntelliJ IDEA で表示される画面上で Build 番号を確認できます。

プラグインは ZIP 形式でダウンロードされますが、このファイルは解凍せずにそのままにしておいてください。

02_プラグイン003.png

02_プラグイン004.png

次に、IntelliJ IDEA にプラグインのインストールを行います。IntelliJ IDEA -> Preferences... を開くと、Default Preferences ウィンドウが表示されます。

02_プラグイン005.png

02_プラグイン006.png

このウィンドウの左側のメニューから Plugins を開き、Install plugin from disk... を選択して先程ダウンロードしたプラグインのZIPファイルを選択します。

02_プラグイン007.png

無事にインストールが完了すると、以下のような画面となるので Restart IntelliJ IDEA というボタンをクリックすることで IntelliJ IDEA を再起動させます。

これで、IDE へのプラグインのインストールは完了です。

02_プラグイン008.png


IntelliJ IDEA 上で Perl スクリプトを実行してみる

IntelliJ IDEA の再起動が完了したら、早速 Perl スクリプトを実行するためにプロジェクトを作成しましょう。以下の画面から、Create New Project をクリックします。

03_実行001.png

次に、プロジェクトの種類として Perl5 module を選択し、Next をクリックします.

03_実行002.png

プロジェクトの種類を Perl5 module としているため、ここで IntelliJ IDEA がこのプロジェクトの Perl スクリプトを実行する際に使用する Perl インタプリタの位置を指定します。Project SDK に Perl インタプリタが何も表示されていない場合や、新たに Perl インタプリタを追加したい場合には右上の Configure... をクリックして下さい。

03_実行003.png

本当は perlbrew や plenv を使うことでプロジェクトごとに使用する Perl インタプリタのバージョンを分けたほうが良いかと思いますが、ここでは macOS Yosemite に標準でインストールされている /usr/bin/perl を指定しました。

(Unix系OS では Perl は /usr/bin/perl として標準的にインストールされているはずです。Windows の場合は C:¥Program Files¥ ディレクトリの中にインストールされるかと思います。)

ここで指定するのは Perl インタプリタがインストールされている ディレクトリ となっているので、/usr/bin/perl を使用する場合には、/usr/bin ディレクトリを指定すればOKです。

Project SDK に Perl インタプリタが追加されたのが確認できたら、Next をクリックします。

03_実行004.png

次に作成しようとしているプロジェクトの名前と、そのプロジェクトが配置されるディレクトリのパスを指定します。ここでは、プロジェクト名を untitled とし、ホームディレクトリ中の IdeaProjects 中に保存されるように指定しています。

入力できたら、右下の Finish をクリックします。

03_実行005.png

指定したプロジェクトの位置が存在しない場合には以下のようなアラートが表示されますが、OK をクリックすれば大丈夫です。

03_実行006.png

ここまででプロジェクトの初期設定が完了し、以下のように IDE のメインウィンドウが表示されます。Tip of the Day というウィンドウが表示される場合には Close をクリックして閉じておいてください。また、ウィンドウ左側にプロジェクトの構造が表示されていない (プロジェクトツールウィンドウが非表示) の場合には、Windows では Alt + 1、macOS では Command + 1 キーを入力してプロジェクトツールウィンドウを表示させておいてください。

03_実行007.png

では、新たに Perl スクリプトを作成してみましょう。画面左側のプロジェクトツールウィンドウ上でプロジェクト名 (この例では untitled) を右クリックし、表示されるコンテキストメニューから New -> Perl5 File と選択します。

03_実行008.png

作成する Perl スクリプトのファイル名を入力します。ここでは、main.pl という名前で Perl スクリプトを作成するため、Name を main とし、Kind を Script に設定します。Name には .pl などのファイルの拡張子は不要なので注意して下さい。

入力できたら、OK をクリックします。

03_実行009.png

これにより、プロジェクト中に main.pl という Perl スクリプトが作成されました。

試しに Hello, World を作成してみましょう。main.pl の中身を以下のように書き換えてみましょう。

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';

print("Hello, World!\n");

03_実行010.png

書き終えたら、プロジェクトツールウィンドウ上で main.pl を右クリックし、表示されるコンテキストメニューから Run 'main.pl' を選択して Perl スクリプトを実行してみましょう。

(このとき Run 'main.pl' という項目が表示されない場合には、IDE によるプロジェクトのインデックス作成がまだ終了していないためかと思いますので、しばらく IDE をそのまま放置しておいて下さい。インデックス作成の進捗は画面最下部のバー上に表示されるかと思います。)

03_実行011.png

問題なく Perl スクリプトが実行できると以下のように IDE の画面下部にコンソールが表示され、main.pl の実行結果が確認できるかと思います。

03_実行012.png

これにより、IntelliJ IDEA 上で Perl スクリプトの作成と実行ができるようになりました。

しかし、実はまだ IntelliJ IDEA でのデバッグ機能は利用できない状態となっています。試しに、プロジェクトツールウィンドウ上で main.pl を右クリックし、表示されるコンテキストメニューから Debug 'main.pl' を選択して Perl スクリプトを実行してみると...

03_実行013.png

以下のように、コンソール上でエラーが表示されてしまいます。これは、Perl インタプリタが Devel::Camelcadedb というモジュールを認識できなかったためです。

03_実行014.png

したがって、次にこの Devel::Camelcadedb モジュールのインストールを行い、IntelliJ IDEA 上でデバッグ機能が利用できるように設定していきましょう。


Devel::Camelcadedb を導入し、IntelliJ IDEA 上でのデバッグ機能を有効にする

IntelliJ IDEA 上でデバッグ機能が利用できるようにするために、Devel::Camelcadedb モジュールのインストールを行いましょう。

このモジュールは CPAN で公開されていますので、CPAN が利用できる環境では CPAN 経由でインストールを行うのが一番楽だと思います。

CPAN からインストールするためには、ターミナル上で以下のコマンドを実行すればOKです。インストールするディレクトリへの権限が問題となってエラーが発生してしまうことがありますので、sudo をつけて実行すると良いかと思います。

$ sudo cpan install Devel::Camelcadedb

CPAN を初めて利用する場合には初期設定のためにいくつかの質問に答える必要があるかと思いますが、基本的には yes と入力して Enter キーを押せば大丈夫です。

Docker コンテナを立てる場合など、CPAN をスクリプトから利用したい場合には環境変数を設定しておくことでこの初期設定の自動化が行なえます。Bash の場合には、 export PERL_MM_USE_DEFAULT=1 となります。

CPAN でのインストールはかなり時間がかかりますが、コーヒーでも飲んでゆっくり待ちましょう。



(17/01/25 追記)

cpanminus を使用されている方はもちろん cpanm コマンドで問題なくインストールできます。

$ sudo cpanm install Devel::Camelcadedb



(17/05/13 追記)

sudo を使って CPAN モジュールのインストールを行うのはマズイだろうとのコメントをいただきましたので、Perl をローカルにインストールして sudo なしで Devel::Camelcadedb をインストールする方法についても記載しておきます。

Perl をローカルにインストールする際には、plenv を用いるのが多いのではないでしょうか。macOS の場合には Homebrew 経由でインストールできます。plenv は Perl インタプリタのコンパイル処理を perl-build に依存しているため、perl-build も同時にインストールしておきます。

$ brew update

$ brew install plenv perl-build

インストールが完了したら、お使いの環境に合わせて ~/.bash_profile~/.profile あるいは ~/.zshrc に以下の 2 行を追記しておきます。詳細は plenv のリポジトリ を参照して下さい。


  • Bash の場合

export PATH="$HOME/.plenv/bin:$PATH"

eval "$(plenv init -)"


  • Zsh の場合

export PATH="$HOME/.plenv/bin:$PATH"

eval "$(plenv init - zsh)"

これが完了したら、一度シェルをリロードしておきます。

$ exec $SHELL -l

plenv のインストールが問題なく完了したか確認しておきましょう。

以下のコマンドを実行して、

$ plenv --version

以下のような出力が表示されたらOKです。

plenv 2.2.0

次に、plenv を使って Perl をローカルにインストールしてみます。plenv では $ plenv install -l というコマンドでインストール可能な Perl のバージョン一覧を確認することができます。

また、指定したバージョンの Perl をインストールするためには、$ plenv install Perl のバージョン というコマンドを使用します。

ここでは 5.25.12 をインストールしてみます。

$ plenv install 5.25.12

これにより、Perl のソースコードのダウンロードとコンパイルが実行され、ローカルに Perl がインストールされることになります。

ローカルにインストールした Perl を開発で使用するため、シェル上で $ perl と叩いた際に今インストールした Perl を優先的に見に行くように設定を行いましょう。(詳細は plenv のリポジトリ を参照して下さい。)

$ plenv global 5.25.12

$ plenv rehash

これにより、シェル上で $ perl と叩いた際に呼ばれる Perl がローカルにインストールしたものに変更されるはずです。

以下のコマンドを実行すると、

$ perl --version

出力は以下のようになるはずです。

This is perl 5, version 25, subversion 12 (v5.25.12) built for darwin-2level

(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2017, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

続けて、ローカルにインストールした Perl で cpanm が利用できるようにインストールを行っておきましょう。

$ plenv install-cpanm

これにより、ローカルにインストールした Perl で cpanm が利用できるようになります。

インストール時にエラーが発生する場合、エラーログが ~/.cpanm/work の下に出力されるのでログファイルを参照してみて下さい。

ここまでできたら、Devel::Camelcadedb モジュールのインストールは以下のコマンドから行うことができます。

$ cpanm install Devel::Camelcadedb

これもインストールに失敗する場合には ~/.cpanm/work の下にエラーログが出力されるので、各自ログファイルを参照してみてください。


なお、CPAN を使いたくない場合には CPAN のウェブサイトから tarball をダウンロードしてきて make で自前でインストールすることもできます。

Devel::CamelcadedbCPAN ページ の以下の図に示した箇所から Devel::Camelcadedb の tarball (この例では Devel-Camelcadedb-1.6.1.6.tar.gz) をダウンロードします。

04_デバッグ001.png

ダウンロード終了後、以下のコマンドを順番に実行することで、Devel::Camelcadedb の解凍およびインストールが行なえます。

$ tar xvzf Devel-Camelcadedb-1.6.1.6.tar.gz

$ cd Devel-Camelcadedb-1.6.1.6
$ perl Makefile.PL
$ make
$ make test
$ make install

CPAN からインストールする場合も、tarball からインストールする場合も、インストール後に Devel::Camelcadedb がどこのディレクトリにインストールされるかを注意しておいて下さい。インストールされる場所に応じて、IntelliJ IDEA 上で追加の設定が必要となる可能性があります。

Devel::Camelcadedb インストール時のターミナルへの出力中から以下のようなログを探しておきましょう。このディレクトリの場所をよく覚えておいて下さい。

04_デバッグ002.png

さて、これにより Perl モジュール Devel::Camelcadedb のインストールが完了したので、ターミナルから IntelliJ IDEA に戻りましょう。

Devel::Camelcadedb が正しく認識されているかを確認するために、もう一度デバッグを試してみましょう。プロジェクトツールウィンドウ上で main.pl を右クリックし、表示されるコンテキストメニューから Debug 'main.pl' を選択して Perl スクリプトを実行してみましょう。

すると、今度は以下のようにエラー無く Perl スクリプトが実行できるようになっているのではないでしょうか?

04_デバッグ003.png


相変わらずエラーになってしまう場合

Devel::Camelcadedb をインストールしても相変わらず Can't locate Devel/Camelcadedb.pm in @Inc (... のようなエラーが表示される場合は、Devel::Camelcadedb はインストールできていても IntelliJ IDEA が Devel::Camelcadedb がインストールされているディレクトリを読みに行くように設定されていない可能性があります。

(Devel::Camelcadedb 以外にも、このモジュールが依存している JSON::XS モジュールや Canary::Stability モジュールなどがインストールされているディレクトリを IntelliJ IDEA が読みに行っていない場合にも同じようなエラーが発生します。)

このエラーに対処するため、IntelliJ IDEA に追加モジュールを認識させましょう。

画面上部の File メニューから Project Structure... を選択します。

04_デバッグ004.png

すると、以下のように Project Structure ウィンドウが表示されます。

04_デバッグ005.png

ウィンドウ左側のメニューから Modules を選択しましょう。すると、現在のプロジェクトで読み込む追加モジュールの指定ができる画面となるので、このウィンドウ中から Add Content Root をクリックしましょう。ここで、先程確認しておいた Devel::Camelcadedb がインストールされたディレクトリが外部モジュールとして認識されるように追加しましょう。

(僕の場合には、~/perl5/lib/perl5/Devel/Camelcadedb.pm としてインストールされていたため、~/perl5/lib/perl5 ディレクトリを選択しました。)

04_デバッグ006.png

ディレクトリを選択したことで、Project Structure ウィンドウの右側に選択したディレクトリの名前が表示されるようになります。(表示されない場合、一度 Project Structure ウィンドウを OK をクリックして閉じ、再度 File -> Project Structure... から再表示させて下さい。)

指定したディレクトリの名前が表示された場合、そのディレクトリの名前をクリックしましょう。

04_デバッグ007.png

すると、以下の図のようにウィンドウ中心の領域に指定したディレクトリ以下に存在する Perl モジュール群がファイルツリーとして表示されます。

(このスクリーンショットは都合上、~/perl5/lib/perl5 中にほとんど Perl モジュールが存在しないコンピュータで作成したためウィンドウ中心にほとんどモジュールが表示されていませんが、本来はこの部分に Devel::Camelcadedb も含む様々なモジュールが表示されるかと思います。)

その後、このモジュールをライブラリとして登録するために、このウィンドウ中央のファイルツリーのルートディレクトリ (すなわち、先程追加した外部モジュールがインストールされているディレクトリ) をクリックし、ウィンドウ上部の Mark as 中の Libraries をクリックします。

04_デバッグ008.png

完了すると、以下の図のように Libraries ボタンが選択状態となり、ファイルツリーのルートディレクトリのアイコンが変化します。この状態となったら、ウィンドウを OK ボタンをクリックすることで閉じましょう。

04_デバッグ009.png

この設定により、IntelliJ IDEA から Devel::Camelcadedb モジュールが参照されるようになるかと思います。IntelliJ IDEA への外部モジュール登録についての詳細は、Perl for IntelliJ IDEA の公式リポジトリ上の Wiki ページ を参照してみて下さい。


デバッガによるステップ実行と変数の状態の可視化を試す

それでは、せっかくデバッガが IDE 上から利用できるようになったので、デバッガのメリットがよく分かるようにサンプルをプログラムをつくってみましょう。main.pl を以下のように変更してみましょう。掛け算を行う簡単な関数を作成しています。

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';

print("Hello, World!\n");

my $res = multiply(8, 8);
print("$res\n");

sub multiply {
my $n = shift;
my $times = shift;
my $acc = 0;

for (my $i = 0; $i < $times; $i++) {
$acc += $n;
}

return $acc;
}

次に、ブレークポイント の設定をしましょう。ブレークポイントとは、スクリプトをデバッグする際に指定した行でプログラムを一時停止させるために設定する目印のこと。IntelliJ IDEA の場合、エディタ上の行番号の右側の空白部分をクリックすることで設定できます。ブレークポイントは赤い丸(●)で表されます。

ブレークポイントが設定できたら、再びプロジェクトツールウィンドウ上で main.pl を右クリックし、表示されるコンテキストメニューから Debug 'main.pl' を選択することでデバッグを開始してみましょう。

以下に、どのように動作するのかを示しますね。

04_デバッグ010.gif

確かに、ブレークポイントで設定した位置でプログラムの動作が一時停止しています。その後、画面下側の Step OverStep Into でプログラムを 1 行ずつステップ実行ができるようになっています。その際、JetBrains 社製 IDE ではおなじみの コードの真横に各変数の中身が表示される という機能もしっかり動作しているのが分かるかとおもいます。

ここまでで、Perl でも他の言語と同じように視覚的にかなり分かりやすくデバッグ作業を行うことができる開発環境を構築することができました。


モジュールを作成してみる

試しに、IDE 上でのモジュール作成も試してみましょうか。画面左側のプロジェクトツールウィンドウ上でプロジェクト名を右クリックし、表示されるコンテキストメニューから New -> Perl5 File と選択します。

05_モジュール001.png

次に、Name にモジュールの名前を入力します。ここでは例としてフィボナッチ数を計算するモジュールを作成するので、モジュール名を Fibo とします。また、ここでもモジュールの拡張子である .pm は不要ですので注意して下さい。

Kind は今回は Package を選択します。

選択できたら、OK をクリックします。

05_モジュール002.png

これにより、プロジェクト中に Fibo.pm という Perl モジュールが作成されました。 Fibo.pm の中身を以下のように書き換えてみましょう。

package Fibo;

use strict;
use warnings FATAL => 'all';

sub new {
my ($class, %args) = @_;
bless \%args, $class;
}

sub calc_nth_fibonacci {
my $self = shift; # 第一引数は self
my $n = shift; # 第二引数.

my @table = ();

if ($n < 1) {
return -1;
}

for (my $i = 1; $i <= $n; $i++) {
if ($i == 1 or $i == 2) {
@table = (@table, 1);
} else {
@table = (@table, $table[$i - 2] + $table[$i - 3]);
}
}

return $table[scalar(@table) - 1];
}

1;

すると、以下のようになるかと思います。

05_モジュール003.png

では、今度は main.pl から作成した Fibo モジュールを読み込んでみましょう。main.pl を以下のように変更します。

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use Fibo;

my $fibo = Fibo->new();
my $res = $fibo->calc_nth_fibonacci(10);
print("$res\n");

すると、以下のようになります。

05_モジュール004.png

では、main.pl を実行してみましょう。プロジェクトツールウィンドウ上で main.pl を右クリックし、表示されるコンテキストメニューから Run 'main.pl' を選択してプログラムを実行してみます。

すると、以下のように main.pl からきちんと Fibo.pm が読み込まれてプログラムが動作しているのがわかるかと思います。ブレークポイントを設定してデバッグを実行すれば、複数ファイルを跨ぎながらプログラムのステップ実行も行えます。

05_モジュール005.png


テストを書いてみる

折角なので、IDE 上でのテストの作成も行ってみます。画面左側のプロジェクトツールウィンドウ上でプロジェクト名を右クリックし、表示されるコンテキストメニューから New -> Perl5 File と選択します。

06_テスト001.png

次に、Name にテストファイルの名前を入力します。ここでは先程作成した Fibo モジュールのユニットテストを作成するため、テストファイルの名前は FiboTest とします。また、ここでもテストファイルの拡張子である .t は不要ですので注意して下さい。 Kind は今回は Test を選択します。 選択できたら、OK をクリックします。

06_テスト002.png

これにより、プロジェクト中に FiboTest.t というテストファイルが作成されました。しかし、このままだとモジュールファイルとテストファイルが同じディレクトリ内に混在してしまって不便です。したがって、テストファイルはディレクトリ内のサブディレクトリ中でまとめて管理するようにしましょう。

プロジェクトツールウィンドウ上で FiboTest.t を右クリックし、表示されるコンテキストメニューから Refactor -> Move... と選択します。

06_テスト003.png

すると以下のようなウィンドウが表示されるので、テストファイルを格納するためのサブディレクトリの名前を入力しましょう。ここでは、テストファイル用のサブディレクトリの名前として test を指定しています。

(なお、こちらの記事 によると、Perlベストプラクティス という本では、テスト対象の Perl コードが配置されているディレクトリと同じ階層に t ディレクトリを作成し、そこにテストファイルを配置するのが習わしとなっていると書かれているそうですので、test ディレクトリよりも t ディレクトリのほうがより好ましいのかもしれません。)

ディレクトリ名が指定できたら OK をクリックしましょう。

06_テスト004.png

FiboTest.t の中身を以下のように書き換えてみましょう。

#!/usr/bin/perl

use strict;
use warnings;
use Test::More;

# パッケージ読み込みテスト.
use_ok('Fibo');

# オブジェクト生成.
my $__fibo = Fibo->new();

# インスタンステスト.
isa_ok($__fibo, 'Fibo');

# テストメイン部.
subtest '4番目のフィボナッチ数は3' => sub {
# Arrange
my $expected = 3;

# Act
my $fibo = Fibo->new();
my $actual = $fibo->calc_nth_fibonacci(4);

# Assert
is($actual, $expected);
};

subtest '5番目のフィボナッチ数は5' => sub {
# Arrange
my $expected = 5;

# Act
my $fibo = Fibo->new();
my $actual = $fibo->calc_nth_fibonacci(5);

# Assert
is($actual, $expected);
};

subtest '10番目のフィボナッチ数は55' => sub {
# Arrange
my $expected = 55;

# Act
my $fibo = Fibo->new();
my $actual = $fibo->calc_nth_fibonacci(10);

# Assert
is($actual, $expected);
};

# テスト終了.
done_testing();

すると、以下のような状態となるかと思います。

06_テスト005.png

では、FiboTest.t を実行してすべてのテストが期待したとおりに動作するか確認してみましょう。プロジェクトツールウィンドウ上で FiboTest.t を右クリックし、表示されるコンテキストメニューから Run 'FiboTest.t' を選択してテストを実行してみます。

06_テスト006.png

すると、以下のように FiboTest.t 中のすべてのテストが実行され、すべて期待したように実行されていることがわかります。また、これまでと同様にブレークポイントを設定した状態でデバッグを実行すれば、1 つ 1 つのテストの動作をステップ実行で追いかけながらどこの処理で失敗しているのかを簡単に調べることができます。

テストコードは Git などのバージョン管理ツールで実装コードと共に管理することで、変更を行った際にリグレッションが発生した場合に どこの変更に起因して発生しているのかを解析するのを容易にします。 IDE の導入と共に積極的にテストを書いていきたいですね。

06_テスト007.png


IDE 導入によるその他のメリット

IDE 導入によるコードの作成やデバッグ、モジュールやテストの作成について見てきましたが、IDE を導入することで他にも開発を容易にする以下のようなメリットがあります。

まずは、コード補完 が効くことです。これにより、参照したい変数やメソッドの名前を打ち間違えるようなミスを劇的に減らすことができます。

07_コード補完001.gif

また、リファクタリング機能も使用できます。変数名や関数名の上で右クリックをして表示されるコンテキストメニュー中から Refactor -> Rename... を行うことで変数名や関数名を一括して変更することができます。

こういった機能を活用することで、手作業での変数名や関数名の変更の際に発生する変更し忘れを防止することができます。

07_リファクタリング001.gif

また、編集しているプロジェクトが Git によってバージョン管理されている場合、IDE 上での Git 連携機能を利用することで Add, Commit, Push をすべて IDE 上で完結することができます。Git プラグインは IntelliJ IDEA では標準で搭載されています。

画面左側のプロジェクトツールウィンドウ上でプロジェクト名を右クリックし、表示されるコンテキストメニューから Git -> Add を選択することで Git リポジトリへの Add が可能です。

07_Git001.png

また、Git -> Commit Directory... を選択すれば、Git リポジトリへの Commit も簡単です。

07_Git002.png

表示される Commit Changes ウィンドウ上で Commit Message を入力し、Commit ボタンをクリックするだけで Commit ができます。また、必要に応じてこの Commit ボタンから Github や Bitbucket 上のリモートリポジトリへの Push も可能です。

07_Git003.png

その他にも、JetBrains 社製 IDE は共通して IdeaVim という Vim キーバインド用の公式プラグインを提供しています。Vim に慣れている人は、IntelliJ IDEA -> Preferences... を開いて Default Preferences ウィンドウを表示し、左側のメニューから Plugins を選択した後に Install JetBrains plugin... をクリックして表示されるウィンドウ上で IdeaVim を検索してインストールをしてみてください。


終わりに

IntelliJ IDEA を活用して Perl 開発のためのモダンな開発環境の構築ができました。これで Perl コードのメンテナンスもだいぶ快適に行えるようになったのではないでしょうか。

この開発環境の構築は IntelliJ IDEA 以外でも可能ですが、一部 IDE 上での操作が異なる可能性があります。念のため、WebStorm上で開発環境を構築する記事 も作成しているのでもしも他の IDE 上で Perl の開発環境を整えたいという場合には参考にしてみてください。


でも、まだこれで終わりではありません。Perl コードのメンテナンスといえば CGI のメンテナンスです。CGI は IDE が動作しているローカル環境以外のコンピュータで動作するため、デバッグはかなり困難となります。しかしながら、今回ご紹介した Perl for IntelliJ IDEA プラグインと Devel::Camelcadedb モジュールを活用することで、リモートコンピュータ上で動作している Perl スクリプトのデバッグをローカルマシン上で動作している IDE 上で行うことができるようになります。

詳細は こちら の記事をお読み下さい。

それにしても、Devel::Camelcadedb の開発者である Alexandr Evstigneev (hurricup) さん凄すぎる...

(コミットログ を見る限り、 Devel::Camelcadedb の最初のコミットは去年 (2016年) の 5 月頃だった模様。まだ 1 年経ってなかったんだ...)