Windows風設定ファイルの利用

[HOME] [BACK] [NEXT]

ここでは、「シンプル掲示板」という昔作ったプログラムを例に、設定用ファイルとそのファイル内データの読み込みについて説明します。

私が作成したCGIプログラムは拡張子が「ini」の設定ファイルを使っています。中身はテキストファイルですが、Windows3.1の頃からWindowsアプリやWindowsの設定ファイルとして形式が決められています。これに慣れているので、Perlのプログラムもこの設定ファイルを使う事にしました。

シンプル掲示板では、簡単にある程度のカスタマイズを行える様にするために、背景色、タイトルカラー、一つのファイルに保存する発言数、保存ファイルの最大数等の設定情報を「brd-pl.ini」という設定ファイルにあらかじめ書いておいてプログラムが適宜参照して使っています。

※これも古い記事ですが、手軽なので実験的なコードを書く時などに未だに使っています。しかし皆さんはConfig::Simple を使いましょう。私もちゃんとしたプロジェクトではこちらを使っています。

1.Windows風設定ファイルの利用

Windowsではiniファイルのread/writeのために標準のAPI関数が容易されており、この関数を呼び出して 作業すれば良いのですが、当然perlには有りません。そこでWindowsのiniファイルのデータ読み込みAPI関数と同等の サブルーチンを作ってこれをどのCGIでも利用しています。以下はあまりスマートでは有りませんがこのサブルーチン のソースです。書き込み用は作ってません。

sub read_inifile{   
#iniファイル名、ブロック名、ブロック(ハッシュ)を引数とする。   
#指定のブロック名のブロック(ハッシュ)を返すことが目的   
 local($ifile,$blkname,*blk)=@_;   
 if (-e $ifile){
  open R,"<$ifile" or die "Cannot Open $ifile :$!"; #読み込み専用
  flock R, $EX_LOCK;
  local($i,$state,$work);
  $i=1;
  $state=0;
  while($i){
   $work=<R>;
   $_=$work;
   s/\r//;
   s/\n//;
   $work=$_;
   if ($work){ #ファイルの終わりで偽となる。
    if ($state==0){
     if ($work=~/¥[$blkname¥]/){$state=1;}
    }elsif ($state==1){
     if ($work=~/^\[/){ #次のブロックの開始行なら
      $state=2; #何もしないで終了ステートへ
      $i=0;
     }else{
      if ($work=~/=/){ #ブロック内の式が有ったら
       $blk{"$`"}=$'; #ハッシュ生成
      }else{ #iniファイルの最終行を抜けたら
       $state=2;
       $i=0;
      }
     }
    }
   }else{
    $i=0;
   }
  }
  flock R, $UNLOCK;
  close R;
 }else{
  print "<BR>設定ファイルが有りません。<BR>\n";
 }   
}

例えば「board.ini」というiniファイル(テキストファイルです)の中身が

[TEXT]   
COLOR=#000000   
LINKCOLOR=#BF5FBF   
VLINKCOLOR=#BF5FBF   
[TITLECOLOR]   
TOPTEXT=#9F3F3F   
BACK=#C0C0C0   
TEXT=#9F3F3F   

となっているとして、CGIプログラムの中で

read_inifile(´board.ini´,´TEXT´,*text_block);

の様に呼び出した後「$textblock{´COLOR´}」を参照すると「#000000」が 代入されており、「$textblock{´LINKCOLOR´}」を参照すると「#BF5FBF」が 代入されているという具合です。

[HOME] [BACK] [NEXT]

更新日: