具体的なスクリプトについては、基本編から見ていきますが、ここでは、自分で作成したスクリプトのデバッグ方法について、説明します。
Rubyのスクリプトを作成しても、最初から完全なものができるとは限りません。むしろ、大部分が「Syntax Error(文法エラー)」になっているか、入力ファイルや出力ファイルを正しく指定していないため、正しい実行結果が得られないほうが多いのです。このうち、「Syntax Error(文法エラー)」については、Rubyでチェックすることができます。
ComWin32やMS-DOSプロンプトなどRubyを実行できる環境で、以下のようにして、[Enter]キーを押します。
C:\>ruby -cw スクリプト名
上記のように「Ruby」と「スクリプト名」の間に「-cw」スイッチを入れて実行することで「Syntax Error(文法エラー)」があるかどうかチェックできます。「-cw」スイッチは「-c」スイッチと「-w」スイッチを組み合わせたもので、「-c」スイッチは、文法チェックだけを行い、スクリプトを実行しないためのスイッチであるのに対し、「-w」スイッチは、文法チェック等によって警告メッセージを表示するためのスイッチです。
エラーメッセージは、以下のように何行目がエラーか表示されます。下記の例では、「rb:45」とありますが、コメントを含めた45行目でエラーが発生していることを示しています。場合によっては、具体的にどの部分がエラーだったのか「^」で示している場合もあります。
エラーメッセージが表示されたら、その前後の行をよく見て、エラーがないかを探します。while命令やif文に対応する「end」がついていないなどのケースやPerlと間違えて、「;」をつけてしまうこともありますが、必ずしも、「rb:xx」で指定された近くに原因がない場合があります。
すべてのエラーがなくなれば、「Syntax OK」と表示されます。
【-cスイッチの場合】
D:\work\data01>ruby -cw keybreak.rb keybreak.rb:45: parse error elsif (in1[0] == "BBBB") ^ keybreak.rb:50: parse error
【-cwスイッチの場合】
D:\work\data01>ruby -cw keybreak.rb keybreak.rb:45: parse error elsif (in1[0] == "BBBB") ^ keybreak.rb:45: warning: useless use of == in void context keybreak.rb:50: parse error
文法チェックでは見つからないエラーが実行してから発見されることがあります。典型的な例として、それぞれ以下のようなケースがありますので、それぞれについて対応策を述べます。実際にはさまざまなケースがありますので、以下を参考にしてください。
1.ファイラーで出力ファイルの容量がどのように増加するかチェックします。
2.入力ファイルのデータ量にもよりますが、数MBを超える場合でデータの増え方が異常な場合は、強制終了させます。
3.スクリプトの中の適当な場所に変数を出力する「print」命令を入れて、再度実行します。実際の形式は変数展開を行う部分を
#{変数}
のように、変数部分を「#{」と「}」の間に入れます。具体的には、出力ファイルを「out1_file」とし、出力する変数を「abc」とした場合、
out1_file.print("abc=#{abc}\n")
のようにします。また、配列の添字と内容を出力する場合には、
out1_file.print("table[#{index}]=#{table[index]}\n")
のようにします。このとき、出力件数が増えて、暴走しないようにエラー件数(ここではerr_ctrのこと)をカウントし、一定件数以上になったら、強制終了するようにしておきます。(なお、abortのメッセージはシフトJISの場合、エラーになるので英文表記にしてあります。)
out1_file.print("abc=#{abc}\n") err_ctr += 1 if (err_ctr > 10000) abort "printed over 10,000" end
4.命令を追加した位置と出力された変数の内容からどこが間違っていたのかを推理します。
5.出力する変数や追加する位置を変更して、再度実行します。
6.その後は上記の4と5を繰り返して、正しい結果が出るまで行います(または、とりあえずあきらめます(笑))。
1.スクリプトの中の適当な場所に変数を出力する「print」命令を入れて、再度実行します。実際の形式は変数展開を行う部分を
#{変数}
のように、変数部分を「#{」と「}」の間に入れます。具体的には、出力ファイルを「out1_file」とし、出力する変数を「abc」とした場合、
out1_file.print("abc=#{abc}\n")
のようにします。また、配列の添字と内容を出力する場合には、
out1_file.print("table[#{index}]=#{table[index]}\n")
のようにします。
2.命令を追加した位置と出力された変数の内容からどこが間違っていたのかを推理します。
3.出力する変数や追加する位置を変更して、再度実行します。
4.その後は上記の2と3を繰り返して、正しい結果が出るまで行います(または、とりあえずあきらめます(笑))。
デバッグが終わったら、後は実行するだけです。ComWin32やMS-DOSプロンプトなどRubyを実行できる環境で、以下のようにして、[Enter]キーを押すか、ファイラーから該当するスクリプトをダブルクリックします。
C:\>ruby スクリプト名