具体的なスクリプトについては、基本編から見ていきますが、ここでは、自分で作成したスクリプトのデバッグ方法について、説明します。
Perlのスクリプトを作成しても、最初から完全なものができるとは限りません。むしろ、大部分が「Syntax Error(文法エラー)」になっているか、入力ファイルや出力ファイルを正しく指定していないため、正しい実行結果が得られないのです。このうち、「Syntax Error(文法エラー)」については、Perlでチェックすることができます。
ComWin32やMS-DOSプロンプトなどPerlを実行できる環境で、以下のようにして、[Enter]キーを押します。
C:\>perl スクリプト名
上記のように「Perl」と「スクリプト名」の間に「-cw」スイッチを入れて実行することで「Syntax Error(文法エラー)」があるかどうかチェックできます。「-cw」スイッチは「-c」スイッチと「-w」スイッチを組み合わせたものであり、「-c」スイッチは、文法チェックだけを行い、スクリプトを実行しないためのスイッチであるのに対し、「-w」スイッチは、文法チェック等によって警告メッセージを表示するためのスイッチです。
以下、それぞれの場合の一例を表示するので、参照してください。if文の中で「==」ではなく、「=」と指定してしまったため、「-cw」スイッチを指定した場合は、
Found = in conditional, shoblockquoted be == at keybreak.pl line 22.
というメッセージが表示されています。
エラーメッセージが表示されたら、「line xx」のように何行目でエラーが発生しているのか表示されるので、その前後の行をよく見て、エラーがないかを探します。ほとんどのエラーは文の最後に「;」(セミコロン)がついていないとか、「{」に対応する「}」がないなどのケースなので、よく探します。必ずしも、「line xx」で指定された近くに原因がない場合があります。
すべてのエラーがなくなれば、
xxxx.pl(チェックしたスクリプト名が入る) syntax OK
と表示されます。
【-cwスイッチの場合】
D:\work\data01>perl -cw keybreak.pl Found = in conditional, shoblockquoted be == at keybreak.pl line 22. Can't modify length in scalar assignment at keybreak.pl line 22, near "8") keybreak.pl had compilation errors.
【-cスイッチの場合】
D:\work\data01>perl -c keybreak.pl Can't modify length in scalar assignment at keybreak.pl line 22, near "8") keybreak.pl had compilation errors.
文法チェックでは見つからないエラーが実行してから発見されることがあります。典型的な例として、それぞれ以下のようなケースがありますので、それぞれについて対応策を述べます。実際にはさまざまなケースがありますので、以下を参考にしてください。
1.ファイラーで出力ファイルの容量がどのように増加するかチェックします。
2.入力ファイルのデータ量にもよりますが、ファイラーで出力ファイルの増え方をチェックし、数MBを超える場合でデータの増え方が異常な場合は、強制終了させます。
3.スクリプトの中の適当な場所に変数を出力する「print」命令を入れて、再度実行します。実際の形式は
print ファイルハンドル "xxxx=変数名\n";
のようにします。「"(ダブルクォーテーション)」の中に変数を入れることで、変数展開され、「xxxx=1234」のように出力されます。具体的には、ファイルハンドルを「OUT1」として、変数名を「$xxx」とした場合、
print OUT1 "xxx=$xxx\n";
とします。このとき、出力件数が増えて、暴走しないようにエラー件数(ここでは$err_ctrのこと)をカウントし、一定件数以上になったら、強制終了するようにしておきます。
print OUT1 "xxx=$xxx\n"; $err_ctr++; die "10,000件を超えた!" if ($err_ctr > 10000);
4.命令を追加した位置と出力された変数の内容からどこが間違っていたのかを推理します。
5.出力する変数や追加する位置を変更して、再度実行します。
6.その後は上記の4と5を繰り返して、正しい結果が出るまで行います(または、とりあえずあきらめます(笑))。
1.スクリプトの中の適当な場所に変数を出力する「print」命令を入れて、再度実行します。実際の形式は
print ファイルハンドル "xxxx=変数名\n";
のようにします。「"(ダブルクォーテーション)」の中に変数を入れることで、変数展開され、「xxxx=1234」のように出力される。具体的には、ファイルハンドルを「OUT1」として、変数名を「$xxx」とした場合、
print OUT1 "xxx=$xxx\n";
とします。
2.命令を追加した位置と出力された変数の内容からどこが間違っていたのかを推理します。
3.出力する変数や追加する位置を変更して、再度実行します。
4.その後は上記の2と3を繰り返して、正しい結果が出るまで行います(または、とりあえずあきらめます(笑))。
デバッグが終わったら、後は実行するだけです。ComWin32やMS-DOSプロンプトなどPerlを実行できる環境で、以下のようにして、[Enter]キーを押すか、ファイラーから該当するスクリプトをダブルクリックします。
C:\>perl スクリプト名