狭い話だが、暫く前に
Webプログラミングの PHPをかじり始めたと書いた。きっかけはメール箱に受信するスパムを自動で削除する機能の実現だった。2ヶ月ほどかけて70の手習いで勉強方々作ったそれはプログラムとしては拙い出来だったと思うが、外観・動作は一応完成して実用になっている。しかし子供の頃からプラモデルなど作る間は飯もそっちのけで集中するが、一通り出来てしまえばもう関心が薄れるという性格は変わっておらず、PHPも凡そ出来ると分かってしまえば更に高みを目指そうという気はさらさら沸かず、次に何か作りたいものを思いつくまでは小休止状態。
と言うのも、最近このページを出力しているプログラムの些細な変更を思い立ったが、オリジナルはどこかの Webで見つけた 2000年頃のプログラムだから Perlで書かれている。何だかんだで 3000行超えのプログラムだが、今更これを PHPに書き換えて・・・・というほどの気力もない。軟弱にも再び Perlに戻って、思い出し思い出ししながら、変更してみた。当初 1週間位かと見積もった変更作業は、途中余分な変更にまで手を出してしまい、案の定 1ヶ月近くに及びやっと一昨日実用に耐えうる状態になった。しかし今回改めて このプログラムを最初から追いかけてみて、幾つか発見があった。
その最大のものは、ハッシュ配列へのデータの格納方法に関するもの。このプログラムでは数十項目のシステム全体に対するキーとデータの組み合わせを参照しているんだが、今までそのデータをプログラムに読み込むルーチンが見つけられず謎のままだった。Webの解説書などで見る限り、データを保存したファイルを open 文で開いて、while{} や for{}などのループで繰り返しデータを配列に読み込むはずなんだが、そんな処理はどこにも見つからない。プログラム中でデータの保存ファイルが記述されているのは require 文の 1行だけ。どうして require 文 1行でハッシュのデータが読み込めるんだろうと謎だったが、今までこのハッシュのデータをオリジナルのものから変更することなく使い続けて来たので、解析する必要もなく謎のままにしてしまった。
今回、このデータに 項目を増やす必要から腰を据えてプログラムを追いかけてみた。分かったことは require文で読み込むデータファイルの先頭に
%Sys = という 1行があって、それに続けて
(
"color_1" => "#3fbf00",
"color_2" => "#ff0000",
"color_3" => "#bfffbf",
----------------
)
1;
などと続いていることに気づいた。何ということはない、データファイル全体がハッシュの入力文になっていたんだ。Webのサンプルなどでは、プログラムの一部としてこのハッシュ配列の入力文を含めて説明されているが、そのデータの内容をプログラムで変更しようとすると本体プログラムを自身で書き換えることは出来ないから、データファイルを別に用意して while{} で繰り返し読み込む・・・という処理しか思いつかなかったが、%Sys というハッシュをグローバル変数にしておいて、そのファイルを require で読み込めば一発でハッシュに格納できて、データの変更も(こちらは while{} などのループ処理で書き込む必要があるが)別ファイルなら問題ないんだと・・・・正しくコロンブスの卵のような話だった。
20年ほど不明のままにしていた謎が解けて、非常にスッキリと幸せな気分になった。