対話環境でちょっとづつスクリプトを実行して試しながら、スクリプトの開発を行うのは効率のよい方法だと思います。
Perl の対話環境として以下の物が知られています。
Perl デバッガ以外(psh, zoid)は、シェルとして使えるように、シェルライクな構文の拡張が行われています。しかし、psh と zoid はデバッガとしての機能(ブレークポイントの設定、ステップ実行など)はなさそうです(間違っていたら、誰か教えてください)。僕はシェルではなく開発環境を求めているので、Perl デバッガを使うことを想定します。この Perl mode では対話環境として perl -d -e 1 を想定しますが、他の対話環境が使えないという訳ではありません。
以下のツールに加え対話環境用の共通ツールも設定されています。Perl を対話環境で使う際の設定などについては、次の節をご覧ください。
対話型プロセスを起動して、そのプロセスに mi で選択されているテキストをコマンドとして送り込みます。既に対話型プロセスが起動しているターミナルがある場合には、そのターミナルでコマンドを実行します。
選択範囲が無い場合はキャレットがおかれている行を含んだブロックを選択範囲とします。これは、Perl デバッガは評価できる範囲でコードを送らないとエラーが起きてしまうのです 。中途半端な選択範囲(if ブロックや for ブロックの途中までとか)を送りつけるとエラーが起きます(see 複数行の選択範囲を送り込む)。つまりできるだけ、このツールはできるだけエラーが起きないように選択範囲を選びます。
サブルーチンや if 文の先頭行にキャレットを置いて実行すると、それらのブロックをまとめて送ることができます。
対話環境用の共通ツール にも「選択範囲を送る」ツールがありますが、これはPerl モード専用にカスタマイズされたツールです。
変数の値を確認するときに使ってください。例えば、変数 「$x」を mi で選択して、このツールを実行すると、以下のように、print Dumper します。当然、あらかじめ 「use Data::Dumper」を実行しておいてください。
最前面の書類のファルパスを引数として do を実行します。モジュールやライブラリの開発をしている時に便利です。
現在カーソルがある行にブレークポイントを設定します。だたし、そのファイルが Perl にロードされている必要があります。つまり、do, use, require されたファイル内でしか実行できません。subroutine を「選択範囲を送る」などで対話環境に送りつけた場合は、「sub にブレークポイントを設定」を使ってください。
カーソルがある関数にブレークポイントを設定します。
Module::Reload->check;
を実行します。既に読み込まれているモジュールのうち、ファイルシステムで変更があった物だけを再読み込みしてくれます。CPAN から Moudle::Reload をインストールする必要があります。
Perl を対話環境として使うときの設定や注意点について記述します。
多くの場合、Perl はシェルから実行されると思います。その為に多くの場合、ファイルの先頭行は次のように始まっていると思います。
#!/usr/bin/perl
何も設定しないと、このコマンドが対話環境用のコマンドとして認識されてしまいます。対話環境専用のコマンドを設定するには、ファイルの先頭のコメントが連続している領域に次の行を付け足します。
#interactive perl -d -e 1
Perl デバッガで複数行のコードを実行する場合、改行コードをエスケープ(行末にバックスラッシュ)をしないといけません。「選択範囲を送る」を実行したときに、自動的に改行コードをエスケープするには、ファイルの先頭のコメントが連続している領域に次の行を付け足します。
#escapeChars {return}
また、Perl デバッガはエスケープされていない改行がくると入力されたコードを評価してしまいます。中途半端な選択範囲(if ブロックや for ブロックの途中までとか)を送りつけるとエラーが起きます。Perl がちゃんと評価できる範囲で選択して「選択範囲を送る」を実行しなくてはなりません。
何も選択されていないときは、キャレットがある行を含むブロックを選択範囲とします。
結局、対話環境で使う perl スクリプトの先頭部分は次のようになっている必要があります。
#!/usr/bin/perl
#interactive perl -d -e 1
#escapeChars {return}
UnixScriptTools for mi とは関係のない話ですが、Perl を対話環境として使う時に気をつけなければならない注意点を一つ。
次のような my 変数を定義するだけコードを Perl デバッガで評価してもほとんど意味がありません。
my $val = 'hello';
この一文を実行しても、$val の値は、その環境に残りません。入力した文がすべてブロックとして評価され、ブロックの中での my 変数はブロックを抜けるとなくなってしまうようです。多くの変数をグローバル変数にしないと対話環境として使えないです。
モジュールを開発しているとき、何度もモジュールを再読み込みする必要が生じると思います。UnixScriptTools for mi が提供している方法は、ツール「do を送る」です。
もう少し、スマートな方法として、Moudle::Reload を CPAN からインストールするといいと思います。Module::Reload を導入して、
Module::Reload->check;
とすると、既に読み込まれているモジュールのうち、ファイルシステムで変更があった物だけを再読み込みしてくれます。