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

##  はじめに：これは誰のための記事か？

*  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 は現在 [公式サイト](http://padre.perlide.org/) で macOS 用のバイナリがリンク切れとなっており、Homebrew でも提供されていないため、普段 macOS を扱っている自分にはちょっと利用できそうにないです...。 また、[こちら](http://uzulla.hateblo.jp/entry/2014/01/26/225611) では 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` で終わるメールアドレスを登録あるいは学生証のスキャンデータを送信することでこの無償ライセンスを毎年取得できるので積極的に活用していくのが良いでしょう。登録は [こちら](https://www.jetbrains.com/student/) 。)

まずは、IntelliJ IDEA を <https://www.jetbrains.com/idea/> からダウンロードしましょう.
ページをスクロールし、ページの最下部にある `Download` ボタンからインストーラをダウンロードできます。

![01_ダウンロード001.png](https://qiita-image-store.s3.amazonaws.com/0/96400/184a40eb-c501-09b4-a2a3-53a2c4ea3350.png)


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

![01_ダウンロード002.png](https://qiita-image-store.s3.amazonaws.com/0/96400/e9386fd5-944e-ec3c-bb03-63e1ddd936d8.png)


なお、IntelliJ IDEA は標準では日本語化されていませんが、有志の方が [日本語化ファイル](https://github.com/yuuna/IDEA_resources_jp) を公開してくれています。日本語化する場合は [こちら](http://qiita.com/keita-nishimoto/items/31e8af9ccb4b3bdd74d0) を参考にされるとよいかと思います。ただし、日本語化ファイルがこの先メンテナンスされるとは限らないので、英語のままで OK という場合にはそのまま使用されたほうがよいかもしれません。


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

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

![02_プラグイン001.png](https://qiita-image-store.s3.amazonaws.com/0/96400/dbc73ea8-01a3-416b-700b-50fae49ea4b6.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](https://qiita-image-store.s3.amazonaws.com/0/96400/90e55052-9e2b-f5fa-d64c-7be179fb9ceb.png)


プラグインをダウンロードする際、`COMPATIBLE BUILDS` に示されている Build 番号が使用している IDE の Build 番号に該当しているかを確認しておいて下さい。（対応していない Build 番号の IDE にインストールしようとすると、エラーが発生してしまいます。）
IntelliJ IDEA の場合、`IntelliJ IDEA` -> `About IntelliJ IDEA` で表示される画面上で Build 番号を確認できます。
プラグインは ZIP 形式でダウンロードされますが、このファイルは解凍せずにそのままにしておいてください。

![02_プラグイン003.png](https://qiita-image-store.s3.amazonaws.com/0/96400/d4840ea3-83bc-1f27-5b0d-0bc57453ec94.png)

![02_プラグイン004.png](https://qiita-image-store.s3.amazonaws.com/0/96400/4c470684-6a19-541f-4138-43112934d99e.png)


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

![02_プラグイン005.png](https://qiita-image-store.s3.amazonaws.com/0/96400/f7d7b1fb-815d-ea3e-0ca2-d5a57748fc88.png)

![02_プラグイン006.png](https://qiita-image-store.s3.amazonaws.com/0/96400/eb05fff0-da54-61d3-9c75-0121267fb93f.png)


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

![02_プラグイン007.png](https://qiita-image-store.s3.amazonaws.com/0/96400/cfb6c077-937e-1a67-3758-4f4906b6f55c.png)


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

![02_プラグイン008.png](https://qiita-image-store.s3.amazonaws.com/0/96400/0bd45905-fbf5-e0f4-410f-84d3e58a16c6.png)


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

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

![03_実行001.png](https://qiita-image-store.s3.amazonaws.com/0/96400/ac511fd4-e79a-d3bf-102b-20d53a05d5ae.png)


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

![03_実行002.png](https://qiita-image-store.s3.amazonaws.com/0/96400/112e3c60-0710-0f63-3a39-022c3bf07093.png)


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

![03_実行003.png](https://qiita-image-store.s3.amazonaws.com/0/96400/c23d2914-39af-35c7-74ef-5128edf8acfc.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](https://qiita-image-store.s3.amazonaws.com/0/96400/186f684f-2725-c698-686e-4478659225c4.png)


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

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

![03_実行005.png](https://qiita-image-store.s3.amazonaws.com/0/96400/9955a60f-f707-0d6b-46d0-9901f2cd9b6e.png)


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

![03_実行006.png](https://qiita-image-store.s3.amazonaws.com/0/96400/c3bdb0ac-55d2-95eb-2f63-8e95f30d0f34.png)


ここまででプロジェクトの初期設定が完了し、以下のように IDE のメインウィンドウが表示されます。`Tip of the Day` というウィンドウが表示される場合には `Close` をクリックして閉じておいてください。また、ウィンドウ左側にプロジェクトの構造が表示されていない (プロジェクトツールウィンドウが非表示) の場合には、Windows では `Alt` + `1`、macOS では `Command` + `1` キーを入力してプロジェクトツールウィンドウを表示させておいてください。
    
![03_実行007.png](https://qiita-image-store.s3.amazonaws.com/0/96400/404eee6e-5e87-6b36-a5e2-ce3f7f23bb28.png)


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

![03_実行008.png](https://qiita-image-store.s3.amazonaws.com/0/96400/32d7cc7b-eafe-8113-261e-c231511a6375.png)


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

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

![03_実行009.png](https://qiita-image-store.s3.amazonaws.com/0/96400/82b7862d-a558-c5cd-d4b8-b8b4d0502464.png)


これにより、プロジェクト中に `main.pl` という Perl スクリプトが作成されました。
試しに Hello, World を作成してみましょう。`main.pl` の中身を以下のように書き換えてみましょう。

```perl
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';

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

```

![03_実行010.png](https://qiita-image-store.s3.amazonaws.com/0/96400/afcf5830-99d8-85cb-8839-31ee5c57ee6d.png)


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

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

![03_実行011.png](https://qiita-image-store.s3.amazonaws.com/0/96400/d3face2b-19d5-a670-fc3d-8bbd8058faa9.png)


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

![03_実行012.png](https://qiita-image-store.s3.amazonaws.com/0/96400/84a7f2ea-6847-11c7-0235-d5266ad92f81.png)


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

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

![03_実行013.png](https://qiita-image-store.s3.amazonaws.com/0/96400/8737eac5-3c04-66b5-f6e4-4443f8f43e33.png)


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

![03_実行014.png](https://qiita-image-store.s3.amazonaws.com/0/96400/cdcd9190-11ca-ce83-8ea5-7ed31dc09ec0.png)


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


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

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

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

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

```bash
$ sudo cpan install Devel::Camelcadedb
```

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

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

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

-----
### （17/01/25 追記）
cpanminus を使用されている方はもちろん `cpanm` コマンドで問題なくインストールできます。

```bash
$ sudo cpanm install Devel::Camelcadedb
```
-----
### (17/05/13 追記)
`sudo` を使って CPAN モジュールのインストールを行うのはマズイだろうとのコメントをいただきましたので、Perl をローカルにインストールして `sudo` なしで `Devel::Camelcadedb` をインストールする方法についても記載しておきます。

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

```bash
$ brew update
$ brew install plenv perl-build
```

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

*  Bash の場合

```bash
export PATH="$HOME/.plenv/bin:$PATH"
eval "$(plenv init -)"
```

*  Zsh の場合

```zsh
export PATH="$HOME/.plenv/bin:$PATH"
eval "$(plenv init - zsh)"
```

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

```bash
$ exec $SHELL -l
```

plenv のインストールが問題なく完了したか確認しておきましょう。
以下のコマンドを実行して、

```bash
$ plenv --version
```

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

```
plenv 2.2.0
```

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

```bash
$ plenv install 5.25.12
```

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

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

```bash
$ plenv global 5.25.12
$ plenv rehash
```

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

```bash
$ 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 が利用できるようにインストールを行っておきましょう。

```bash
$ plenv install-cpanm
```

これにより、ローカルにインストールした Perl で cpanm が利用できるようになります。
インストール時にエラーが発生する場合、エラーログが `~/.cpanm/work` の下に出力されるのでログファイルを参照してみて下さい。

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

```bash
$ cpanm install Devel::Camelcadedb
```

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

-----

なお、CPAN を使いたくない場合には CPAN のウェブサイトから tarball をダウンロードしてきて make で自前でインストールすることもできます。
`Devel::Camelcadedb` の [CPAN ページ](http://search.cpan.org/~hurricup/Devel-Camelcadedb/lib/Devel/Camelcadedb.pod) の以下の図に示した箇所から `Devel::Camelcadedb` の tarball (この例では `Devel-Camelcadedb-1.6.1.6.tar.gz`) をダウンロードします。

![04_デバッグ001.png](https://qiita-image-store.s3.amazonaws.com/0/96400/22a21f4d-8c0e-47cb-de76-7bce858048f1.png)


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

```bash
$ 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](https://qiita-image-store.s3.amazonaws.com/0/96400/f12d0e91-2669-1b1b-b290-f4cece544e2f.png)


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

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

![04_デバッグ003.png](https://qiita-image-store.s3.amazonaws.com/0/96400/ebde92bb-115b-8ab1-2cc8-3afc062e3dc1.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](https://qiita-image-store.s3.amazonaws.com/0/96400/1bc04f8d-a8d0-f904-5d43-93a12a28d6a6.png)


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

![04_デバッグ005.png](https://qiita-image-store.s3.amazonaws.com/0/96400/c8150479-af47-0fec-2811-184e96ccac01.png)


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

![04_デバッグ006.png](https://qiita-image-store.s3.amazonaws.com/0/96400/fb221f5e-1d88-6887-d4e2-553c8c1224d2.png)


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

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

![04_デバッグ007.png](https://qiita-image-store.s3.amazonaws.com/0/96400/576d7608-2e6a-f1c6-6289-c1aff78c4351.png)


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

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

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

![04_デバッグ008.png](https://qiita-image-store.s3.amazonaws.com/0/96400/b9992d3c-aae8-d17b-fc5d-dd7044440e81.png)


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

![04_デバッグ009.png](https://qiita-image-store.s3.amazonaws.com/0/96400/f91ca0ae-2b78-d4e7-b5fe-ed2307a23c6c.png)


この設定により、IntelliJ IDEA から `Devel::Camelcadedb` モジュールが参照されるようになるかと思います。IntelliJ IDEA への外部モジュール登録についての詳細は、Perl for IntelliJ IDEA の公式リポジトリ上の [Wiki ページ](https://github.com/Camelcade/Perl5-IDEA/wiki/Getting-started:-IntelliJ-IDEA) を参照してみて下さい。

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

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

```perl
#!/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](https://qiita-image-store.s3.amazonaws.com/0/96400/d0940047-678c-add7-af7a-1018becdd676.gif)


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

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


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

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

![05_モジュール001.png](https://qiita-image-store.s3.amazonaws.com/0/96400/580a1a59-d571-855f-1de3-f9b6c4e6f729.png)


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

![05_モジュール002.png](https://qiita-image-store.s3.amazonaws.com/0/96400/362aa867-6ade-2412-1f97-2b0442b30023.png)


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

```perl
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](https://qiita-image-store.s3.amazonaws.com/0/96400/217f832e-3442-2394-9988-77c197203476.png)


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

```perl
#!/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](https://qiita-image-store.s3.amazonaws.com/0/96400/2fd12ec0-a6c4-fd6e-b614-8c346b500135.png)


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

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

![05_モジュール005.png](https://qiita-image-store.s3.amazonaws.com/0/96400/0a0b2f61-c16f-4dd1-a963-e55a160a9c11.png)


##  テストを書いてみる

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

![06_テスト001.png](https://qiita-image-store.s3.amazonaws.com/0/96400/e985fe21-0747-ce7b-2961-6dcf355b39dd.png)


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

![06_テスト002.png](https://qiita-image-store.s3.amazonaws.com/0/96400/6eb145b2-2e9e-bbba-b1dd-946644977af0.png)


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

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

![06_テスト003.png](https://qiita-image-store.s3.amazonaws.com/0/96400/0481e35b-d5e2-39b2-4de5-8908d8c074a0.png)


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

(なお、[こちらの記事](http://d.hatena.ne.jp/It_lives_vainly/20110531/1306843746) によると、[Perlベストプラクティス](https://www.amazon.co.jp/Perl%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Damian-Conway/dp/4873113008) という本では、テスト対象の Perl コードが配置されているディレクトリと同じ階層に `t` ディレクトリを作成し、そこにテストファイルを配置するのが習わしとなっていると書かれているそうですので、`test` ディレクトリよりも `t` ディレクトリのほうがより好ましいのかもしれません。)

ディレクトリ名が指定できたら `OK` をクリックしましょう。
 
![06_テスト004.png](https://qiita-image-store.s3.amazonaws.com/0/96400/b333994a-0999-d247-82cb-d683195ae632.png)


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

```perl
#!/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](https://qiita-image-store.s3.amazonaws.com/0/96400/39ec7486-d7d4-198a-4c4b-fe3b444424d7.png)


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

![06_テスト006.png](https://qiita-image-store.s3.amazonaws.com/0/96400/87c534e3-3b84-6255-8403-f562d8878da4.png)


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

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

![06_テスト007.png](https://qiita-image-store.s3.amazonaws.com/0/96400/95463a60-606b-48d7-b2d0-0e4c571c4a60.png)


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

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

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

![07_コード補完001.gif](https://qiita-image-store.s3.amazonaws.com/0/96400/635ff7bf-78bc-aaf1-5fda-30ce6d4c5c17.gif)


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

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

![07_リファクタリング001.gif](https://qiita-image-store.s3.amazonaws.com/0/96400/23d7c587-9f74-cc5a-9331-a90139f112ad.gif)


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

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

![07_Git001.png](https://qiita-image-store.s3.amazonaws.com/0/96400/79ca2f74-54e8-c925-dc0a-2ffb26e4225d.png)


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

![07_Git002.png](https://qiita-image-store.s3.amazonaws.com/0/96400/665bb82f-5fd9-4aba-bb62-27e3082a9613.png)


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

![07_Git003.png](https://qiita-image-store.s3.amazonaws.com/0/96400/2a61b30e-18d8-f36a-1e18-7bbab2318ad8.png)


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


##  終わりに

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

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

-----

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

詳細は [こちら](http://qiita.com/AnnPin/items/983a56a55d4b45f8e1f2) の記事をお読み下さい。

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

([コミットログ](https://github.com/Camelcade/Perl5-IDEA-Debugger/commits/master?after=Y3Vyc29yOkIAI02pwfrn4ATcm8HN%2B57NzF98KzEwNA%3D%3D) を見る限り、 `Devel::Camelcadedb` の最初のコミットは去年 (2016年) の 5 月頃だった模様。まだ 1 年経ってなかったんだ...)