10.1 困った時、エラー対策、その他

前章までで perl のプログラムの作り方を説明しました。 実際に自分で作ってみると、すぐ動くことは希で、エラー や思った通り動かないことが普通だと思います。このような プログラムの欠陥をバグ(虫)といい、バグを除くことをデバッグ といいます。以下にデバッグの時便利なことをまとめます。

Q: p1-1.pl が動かないのですが...?
A1: perl が、/usr/local/bin/perl に無い場合があります。

% which perl

した結果が、/usr/local/bin/perl で無い場合には、最初の行の

#!/usr/local/bin/perl

を #!(which perl した結果) に置き換えてみて下さい。 ちなみに 電通大の教育系では、#!//opt/CSapp/bin/perl に変更する必要が あります。

もしwhich perl で何も出なかったら perl 自体がないかもしれません。 perl があっても コマンドの path が通っていないかもしれません。 この設定に関しては、この旨を詳しい人に聞いてみて下さい。

A2: p1-1.pl が実行可能になっていない可能性があります。chmod +x p1-1.pl をしてみて下さい。

A3: . が path に入っていない場合があります。その場合には

% ./p1-1.pl

としてみて下さい。これで動けば path を変更すれば ok です。 path の変更の方法は、.cshrc を変更する必要があるのですが、 それは他の教科書を .cshrc や path で検索してみて下さい。

Q: エラーの行に行くには?
A: kterm 上で実行するとエラーを起こした行を示します。その行にいくには、mule (emacs) 上で、

M-x goto-line (または M-G 。設定されていない場合がある。)

と入力すると、Goto line: と行を聞いてくるので、行をいれるとその行にカーソル が飛びます。

Q: よくあるエラーは?
A: 初歩的には、次のようなことが良くあります。

  1. 文の終わりに ; (セミコロン) が無い。
  2. コメントの前に # が無い。
  3. "...", {...}, '...' の対応関係が正しくない。
  4. 漢字、ひらがなを使うとき、EUC コードになっていない。
  5. print "a","b"; で "a" と "b" の間にコンマ , がない。
  6. elsif(正) が elseif(誤) になっている。
  7. 配列 @a の要素が $a[1](正) でなく @a[1](誤)になっている。
  8. 特殊記号を印刷するとき \ をつけていない。
  9. 主プログラムの先頭に #!/usr/local/bin/perl がない。
  10. require する file の最後に 1; がない。
  11. 行入力したデータの改行 \n を chop しないで文字列として使用した。
これに当てはまらないかチェックして下さい

Q: どうしてもエラーがわからない?
A: まずエラーを起こす行を # コメントにして エラーが起きなくなるか 試してみて下さい。それでエラーが無くなれば、その行だけの問題ですし、 エラーの位置がずれたりしたら、それは {...} の対応関係など前後を含む問題 の可能性があります。

行だけの問題なら、 エラーを起こす行で用いている変数を print してみて、 予想した値に等しいか調べます。また別の方法で表現できないか検討します。 まずまちがいない方法で動かしてみて、次に自分がしようと思った方法の 検討をしてみれば良いと思います。その場合には、 マニュアルをみて使い方が正しいか調べます。 例題に、似たような表現がないか探します。

複数の行に渡る問題であれば、別の file に プログラムを少しづつ copy して、 どの部分まで動作するかを確認します。最初の時は、少しづつプログラムを作って、動作しながらだんだん機能を増やして行くのが良い方法です。その場合、 失敗しても一つ前の段階に戻れるように、「進化の過程」のプログラムを 全て保存しておくのが秘訣です。動作しない部分を、サブルーチンにして そこだけ開発する主プログラムを作ります。大きなプログラムを作る場合には、 サブルーチンに分け、各サブルーチンの動作を良く確認すると良いです。

Q: どうしても自分の力では、解決できない場合には?
A: 最終的には、人に聞くことになりますが、その前にいろいろ 試してみて下さい。決して時間の浪費ではなく、間違い探しの経験を積む と考えて下さい。どうしてだろう、どうしてだろうと考える前に、いろいろ 短いプログラムで実験してみるのが良いです。一晩考えて、何の対策も浮かばない場合には、まず今作ろうとしているプログラムが余りにも遠大すぎないか、 考えて下さい。いきなり月にいくロケットは作れないように、perl にも 技術の積み重ねが必要です。

以上の努力をしても解決できない場合には、人に聞くことになりますが、 聞かれる方も、何を質問しているか答ようのない質問の仕方は良くありません。 分かりやすい質問には、速い適切な返事が期待できます。

[良くない質問の仕方]

  1. プログラムが動かないのですが...? ( 何のプログラムがわからない)
  2. プログラムを動かすと、..... のエラーが表示されて意味がわかりません。 (エラーメッセージから問題を特定するのは、非常に難しい。)
  3. 該当するプログラムは、.... です。 (プログラムの全部または一部をみて、そこから過ちを指摘するのは 「愛」が無ければできない技です。)
[良い質問の仕方]

  1. perl のプログラムの問題であることを明らかにする。
  2. 実行しないのか? 実行するが正しい結果を得ないか? を明らかにする。
  3. エラーを起こす部分が何をしようとしているかを説明する。とくに、 プログラム全体の話より、いかに問題を抽出して説明できるかが決め手。 以下の質問で、xxxx には問題で使われている専門用語 (温度が, とか 圧力が) を一般的なことばに直し、具体的、限定的に説明する。

    (例) xxxx のようなことをしようと思って、..... (2,3 行)という様にプログラムを作りました。しかし、.... のエラーがでます。

    (例) xxxx をしたいのですが、方法がうまくわかりません。私がわかるプログラムは .... ですが、もっと良い方法は無いでしょうか?

    (例) xxxx をする関数、サブルーチンが perl にあってしかるべきだとおもうのですが、ご存知のひとはいないでしょうか?

  4. news に質問をする場合には、subject に situmon とか question とかかかないで、perl のどんな質問か具体的にかく。

    (例) subject: [Q] perl: xxxx no sikata ha?

    news は local なものにまずだし、それで返事が期待できない場合に grobal なところにだす。返事をしてくれた人に感謝をすることを忘れずに。 (次から答えてくれませんよ。)

10.2 その他、終わりに

如何でしたか? perl は少しわかりましたか? この 入門は、コンピュータ入門 の授業のために作成したもので、だいぶ付け焼き刃的です。perl に興味を持ち、 より詳しい正確な知識を知りたい場合には、本屋さんにいって自分の気持ちに一番近い参考書を買って読んでみて下さい。

コンピュータの専門でないとどうしても、他の勉強に時間が取られるというのであれば、これくらいの知識で結構なことができると思います。試してみて下さい。

WWW に入門のマニュアルがあると、短期の授業などに教科書やプリ ントを用意せずに教育に使えて便利です。授業以外にも自習が可能 です。この Perl 入門の誤植、意見、さらに応用編を書き加えても 良いと思っている人のご連絡、投稿を待っています。この入門編 で説明しなかった、pointer の受け渡し、連想配列、ソケット、コ マンドラインでの使用法、X widow との接続、rc232c との接続、 各種有用な例題、ライブラリーの説明、変換プログラムの紹介、 Mosaic の cgi-bin での使用例、などを希望します。(format をあ わせてくれるとうれしいです。)

この入門の file は copy 自由です。例題 と 本文 を それぞれ tar で圧縮した file をおいておきますので、自分の身近な http server においてあげて下さい。

我々のところには、既に maple 入門、LaTeX 入門、xfig 入門などがあります。 csh script, fortran, c, xlib, xwindow, pascal, awk, sed, unix, の入門編を WWW で作った方がいましたら、ぜひリンクしたいので教えて下さい。