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

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

この記事は [前回](http://qiita.com/AnnPin/items/5f868f0c7cb5d1af306b) の IntelliJ IDEA Community Edition 2016.3.3 (以下、IntelliJ IDEA) 上で Perl5 (以下、Perl) の開発環境を整えるという内容の番外編となります。

基本的に前回の記事の内容で他の JetBrains 社製 IDE でも Perl の開発環境を整えることができますが、IntelliJ IDEA 以外の IDE では一部画面の表示が異なっているかと思います。この記事では WebStorm 2016.3.2 (以下、WebStorm) 上での開発環境構築について補足を行いますので、IntelliJ IDEA 以外で開発環境を構築しようと考えられている方の参考にしていただければ思います。

なお、基本的には前回の記事との差分だけを示していきますので、必要に応じて [前回の記事](http://qiita.com/AnnPin/items/5f868f0c7cb5d1af306b) を参照しながら読んでいただければと思います。

この記事でも macOS Yosemite の画面をベースに解説するので、macOS では無い方は適宜読み替えるようによろしくお願い致します。また、今回の内容もやはり **Perl6 には対応していないかと思います**ので、Perl5 専用の開発環境だと思っていただければと思います。


##  WebStorm のインストールとプラグインのインストール

WebStorm のインストールとプラグインのインストールについては前回の記事と変更点はありません。[前回の記事](http://qiita.com/AnnPin/items/5f868f0c7cb5d1af306b) 中の **IntelliJ IDEA Community Edition をインストールする** と **IntelliJ IDEA を起動し、プラグインを導入する** のセクションを参照して下さい。なお、WebStorm のダウンロードページは [こちら](https://www.jetbrains.com/webstorm/) となっています。


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

WebStorm のインストールとプラグインのインストールが完了したら、WebStorm のプロジェクトを作成して Perl スクリプトを実行してみましょう。まず、以下の画面から `Create New Project` をクリックします。

![WebStorm001.png](https://qiita-image-store.s3.amazonaws.com/0/96400/d3644dc2-35ef-e7f0-ec24-174a62e129a1.png)


プロジェクトの種類を選択します。WebStorm は IntelliJ IDEA とは異なり、プロジェクトテンプレートとして `Perl5 module` のように Perl 専用のプロジェクトテンプレートは追加されないようなので、ここでは `Empty Project` を選択します。

プロジェクトの名前と保存される場所を指定したら、`Create` をクリックしましょう。これにより、WebStorm のプロジェクトが作成されました。

![WebStorm002.png](https://qiita-image-store.s3.amazonaws.com/0/96400/02c177ab-0ec1-76bf-0312-ad22f605e095.png)


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

（なお、ウィンドウ左側にプロジェクトツールウィンドウが表示されていない場合には、Windows では `Alt` + `1` キー、macOS では `Command` + `1` キーを押してプロジェクトツールウィンドウを表示させておいて下さい。）

![WebStorm003.png](https://qiita-image-store.s3.amazonaws.com/0/96400/0e2489d0-ac8d-1a2e-c32a-69d28d8bb61b.png)


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

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

![WebStorm004.png](https://qiita-image-store.s3.amazonaws.com/0/96400/b5c87070-dd00-2fa2-d2ff-fc5a00c4886b.png)


これにより、プロジェクト中に `main.pl` という Perl スクリプトが作成されました。しかしながら、画面上部に *Perl5 interpreter is not configured* というワーニングが表示されていますね。これは、WebStorm が Perl スクリプトを実行する際に使用する Perl5 インタプリタが設定されていないというワーニングです。従って Perl スクリプトを編集する前に、まずは Perl5 インタプリタの設定を行いましょう。

![WebStorm005.png](https://qiita-image-store.s3.amazonaws.com/0/96400/513c9f2f-a7b5-fe82-bd6d-a6b775ba8651.png)


画面上部のメニューから `WebStorm` ->` Preferences...` をクリックします。

![WebStorm006.png](https://qiita-image-store.s3.amazonaws.com/0/96400/a5ca426a-5e5a-f357-6001-0c36621757f0.png)


すると `Preferences` ウィンドウが表示されます。この中の左側のメニューから `Languages & Frameworks` -> `Perl5` を選択すると、以下のような画面となります。ここで使用する Perl5 のインタプリタの位置を `Perl5 interpreter path` を右側の `...` ボタンをクリックすることで設定します。

![WebStorm007.png](https://qiita-image-store.s3.amazonaws.com/0/96400/778d18bd-cd67-ee62-a039-cd4c043e14f8.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です。

`Perl5 interpreter path` に `/usr/bin` が設定されたのを確認できたら、`OK` をクリックしてウィンドウを閉じましょう。これで Perl5 のインタプリタの設定が完了しました。

![WebStorm008.png](https://qiita-image-store.s3.amazonaws.com/0/96400/68d9c40e-e62f-e58f-1271-3a6057c34fad.png)


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

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

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

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

(ここで `Run 'main.pl'` という項目がコンテキストメニュー中に存在しない場合は、IDE によるプロジェクトのインデックス作成が終了していないかもしれません。IDE のインデックス作成が完了するまで、しばらくそのまま放置しておいてみてください。インデックス作成の進捗は画面最下部のバー上に表示されるかと思います。)

![WebStorm009.png](https://qiita-image-store.s3.amazonaws.com/0/96400/18c27b82-c2ea-6a74-d827-b1fccf5cba42.png)


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

![WebStorm010.png](https://qiita-image-store.s3.amazonaws.com/0/96400/0c6893a7-287c-67b9-9cb4-946c737298c8.png)


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


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

IntelliJ IDEA Community Edition の場合と同様、このままでは WebStorm 上でのデバッグ機能は利用できないようになっています。したがって、Perl モジュールである `Devel::Camelcadedb` モジュールのインストールが必要となります。モジュールのインストールは CPAN からでも tarball からでも可能となっています。
インストール方法の詳細については [前回の記事](http://qiita.com/AnnPin/items/5f868f0c7cb5d1af306b) 中の **Devel::Camelcadedb を導入し、IntelliJ IDEA 上でのデバッグ機能を有効にする** のセクションを参照して下さい。

また、今回も `Devel::Camalcadedb` モジュールがインストールされるディレクトリの位置を確認しておくようにしてください。

さて、`Devel::Camelcadedb` モジュールのインストールが無事完了したならば、WebStorm 上でデバッグ機能が利用できるようになっているかを確認しましょう。

WebStorm のエディタ上のプログラムの特定の行にブレークポイントを設定した後、ウィンドウ左側のプロジェクトツールウィンドウ上で `main.pl` を右クリックしましょう。その後、表示されるコンテキストメニューから `Debug 'main.pl'` を選択して Perl スクリプトを実行してみましょう。

![WebStorm011.png](https://qiita-image-store.s3.amazonaws.com/0/96400/089e1da7-64a4-9429-00f8-39ddb8267fb4.png)


問題なく WebStorm から `Devel::Camelcadedb` モジュールが読み込めるようになっているのであれば、以下のように正常にデバッグ実行が行われ、きちんとブレークポイントで動作が停止するようになっているかと思います。

![WebStorm012.png](https://qiita-image-store.s3.amazonaws.com/0/96400/0cc98a3c-8f92-3917-7b9e-32c9346c4363.png)


###  エラーが発生してしまう場合

`Devel::Camelcadedb` をインストールしてもデバッグ実行を行う際にエラーが発生してしまう場合は、IntelliJ IDEA Community Edition の場合と同様に WebStorm が `Devel::Camelcadedb` がインストールされたディレクトリを読みに行っていない可能性があります。
従って、WebStorm に追加 Perl モジュールを読み込ませるように設定を行いましょう。

まず、画面上部のメニューから、`WebStorm` -> `Preferences...` を選択し、Preferences ウィンドウを表示させます。次に、ウィンドウ左側のメニューから `Project プロジェクト名(この場合は untitled)` -> `Perl5 libs` を選択します。すると、IntelliJ IDEA Community Edition で設定した場合と同様に、現在のプロジェクトに追加 Perl モジュールを設定するための画面が表示されます。

詳細は[前回の記事](http://qiita.com/AnnPin/items/5f868f0c7cb5d1af306b) の **相変わらずエラーになってしまう場合** のセクションを参照して下さい。基本的には、画面右上の `Add Content Root` ボタンから `Devel::Camelcadedb` がインストールされたディレクトリを選択するとウィンドウ右側の参照ディレクトリのリストに選択したディレクトリが追加されるので、そのディレクトリを Mark as の右側にある `Libraries` ボタンでライブラリとして設定すればOKです。

WebStorm への外部モジュール登録についての詳細は、`Perl for IntelliJ IDEA` の公式リポジトリ上の [Wiki ページ](https://github.com/Camelcade/Perl5-IDEA/wiki/Getting-started:-IntelliJ-IDEA) を参照してみて下さい。

![WebStorm013.png](https://qiita-image-store.s3.amazonaws.com/0/96400/06b9f23c-a788-d659-419c-374154748859.png)


##  その他

後の作業内容は IntelliJ IDEA Community Edition の場合とほぼ同様かと思います。

ただし、テストコード用のディレクトリを作成する場合には、以下のようにして対象ディレクトリを右クリックした後、表示されるコンテキストメニューから `Mark Directory as` -> `Test Sources Root` と設定しておくとよいかもしれません。

![WebStorm014.png](https://qiita-image-store.s3.amazonaws.com/0/96400/89a124e4-cb5e-c603-727d-46775a711899.png)


##  経験した不具合というか注意点

WebStorm 上でテストコード用のディレクトリとして `test` ディレクトリを作成し、WebStorm 上でこのディレクトリの名前を `test` から `t` へと `Refactor` -> `Rename...` でリファクタリングしようのですが、その際に表示されていたワーニングをよく読まないでリファクタリングを実行してしまった結果、テストが落ちるようになってしまいました。

テスト結果自体は *期待している値* も *実際に返却された値* も全く同一であったことから、テストの内容そのものが壊れてしまったようではなかったようです。

テスト失敗時に `Global symbol "$t" requires explicit package name at (eval in cmp_ok)` というよくわからないエラーが発生していたため、デバッガを使ってステップ実行を行うことでエラーの原因を調べてみました。

結論から言うと、ディレクトリ名のリファクタリングを実行した結果、**Test::Builder モジュールのコードの一部が壊れたようです。** (完全にワーニングを無視してリファクタリングを実行しようとした僕の落ち度ですが...)

どうやら、実際にテストを実施する `is()` 関数の呼び出し中にエラーが発生するようになってしまっていたようなのでデバッガを使ってステップ実行でコードを追いかけていったのですが、`Builder.pm` モジュールの `cmp_ok()` 関数の中の 900 行目あたりに以下のようなコードの記述があることに気が付きました。

```perl
        $succ = eval qq[
#line $line "(eval in cmp_ok) $file"
\$t = (\$got $type \$expect);
1;
];
```

このコードを見る限り、変数 `$t` が `my` を付けて宣言されていないために `use strict;` が有効な状態ではエラーになってしまっていたということのようです。

そこで、 「もしや `test` ディレクトリを `t` ディレクトリに変更しようとした際に `$test` 変数も `$t` 変数に変更されてしまったか？」 と考え、このコードを以下のコードへと書き換えてみました。

```perl
        $succ = eval qq[
#line $line "(eval in cmp_ok) $file"
\$test = (\$got $type \$expect);
1;
];
```

ちょうど数行前に `my ($test, $succ);` という `$test` 変数の宣言があったため、状況としてはきれいに対応しています。

この変更を行った後で再度テストを実行してみたところ問題なくテストが実行できるようになっていたため、やはりここが原因だった模様です。

まぁ、ワーニングを無視してしまっていたのが完全に失敗でしたが、外部モジュールとして読み込んでいるライブラリのコードがリファクタリングによって書き換えられたのはちょっと驚きでした。

以後、ワーニングは無視しないように気をつけます...


##  終わりに

IntelliJ IDEA Community Edition に続き、WebStorm でも Perl5 の開発環境の構築ができました。

ここまで来たら、CGI で動いている Perl コードのリモートデバッグも行えるように設定してみたいですね！ 前回から利用している `Perl for IntelliJ IDEA` プラグインと `Devel::Camelcadedb` モジュールを活用すれば、リモートコンピュータ上で動作している Perl スクリプトのデバッグをローカルマシン上で動作している IDE 上で行うことができる環境を **無償で** 構築できます！
詳細は [こちら](http://qiita.com/AnnPin/items/983a56a55d4b45f8e1f2) の記事をお読み下さい。