Perlからのテキスト出力をHTMLでわかりやすく再表示するツールを作成

 これは、現在の常駐先で日常的に行われているWebアプリケーションのリリース作業で用いられているツールのインタフェースを補うものです。
 Perlで作られたテキスト入出力ベースのツールプログラムの出力が一見してわかるような形式でないため、内容確認に慎重さが要求されていました。
 そこで、そのわかりにくい出力結果をHTMLフォームのテキストエリアに貼り付けてボタンを押すと、わかりやすくレイアウトして再表示するツールを作りました。

 HTMLとその内部に埋め込んだJavaScriptで実現しています。
 Webブラウザは最初、FireFox*1で確認しながら作っていたのですが、IE*2で実行してみると、動かなかったので調整しました。開発よりもこの調整のほうが難しかったかもしれません。

 けっこうIEにはJavaScriptの実装に癖があるみたいで、回避のための小細工がいくつか必要でした。しかも、デバッグがしづらい。

 実行途中のデータ状態を確認するには、alert関数を使ってダイアログをポップアップさせて表示する、ということをよくやります。ただ、この方法だと、毎回、ポップアップを閉じる操作をしないと実行を先に進められないので、繰り返しとなると嫌になります。

 そこで、ひとつの工夫として、alertを使わずにconfirmを使うようにしました。confirm関数はOKボタンだけではなく、キャンセルボタンも選択できます。これを使うと、キャンセルを選んだ場合には対話モードでなくすフラグを設定することで、それ以降のconfirmは実行しないでスキップすることができます。同じ箇所の繰り返し実行で、途中までポップアップで確認したら、それ以上の確認は省略して実行を継続させるということができるわけです。

 しかし、これでも十分ではありません。JavaScriptのArrayオブジェクトにはsort関数があり、この関数には比較関数を引数として渡すことができるようになっています。ところが、この比較関数内で「length は Null またはオブジェクトではありません。」というエラーがIEの場合にだけ出て(FireFoxでは問題なく動作するのです)実行が停止してしまうという問題がありました。この場合、比較関数は大量に呼び出されることになります。しかも、何度目かの呼び出しで発生するので、ポップアップで表示させるという方法では手も疲れるし、頭もぼけてしまいます。
 ほんとうなら、ログファイルに途中状態を出力させて、後からその結果を眺めるとよいのですが、JavaScriptにはログファイルに出力するという機能はなさそうです。
 そこで、ポップアップ表示ではなく、ブラウザのステータス行に途中状態を表示させることにしました。このとき、単に問題の関数内の引数や変数を表示させるだけだと、どの呼び出しで問題が発生したのかがわからないので、文脈を特定できるようにするため、 log と名づけた外部変数(Arrayオブジェクト)に文脈を表現する文字列をあらかじめ追加しておき、その内容を合わせてステータス行に表示させることにしました。こうしてようやく、問題の特定ができ、無事にIE特有の問題を解消させることができました。
 めでたしめでたし。