CGIメモ

 最近、仕事や自分のホームページなどでCGIPerlスクリプト)を書く機会が増えてきました。CGIの場合はわりと定型的な処理が多いので、普段から雛型となる処理を研究しておくと開発の手間を大きく削減する事が出来ます。そこで、ここでは私がCGIを開発するうちに辿り着いた定型的な処理をまとめてみる事にしました。


フォームから送られてきたデータの保存

 データ保存を行うCGIでは、フォームから送られてきた情報をそのままあるいは加工して記録する事になります。フォームから送られてきた情報は、連想配列にキー・値の対応として格納し処理をするのが一般的ですね。ただ、フォームの情報が%formという連想配列に入っているからといって

  $data="$form{'no'},$form{'name'},$form{'age'},....."
  $dataをファイルに保存

 などとするのはあまりスマートではありません(経験者は語る(^^;)。ここは、まず「ファイルに記録する項目」の文字列配列を作成し、その配列を利用して一気にデータを作ってしまいましょう。例えば、データとして連想配列のno, name, age, title, bodyを保存するのであれば、

  @dname=('no','name','age','title','body');

 という「保存するキー」の名前を入れた配列を作成し、この配列を利用して

  for ($i=0;$i<@dname;$i++) {
    $w=$form{"$dname[$i]"};
    $data="$data$w,";
  }

 とするのです。これで、「@dataの順番で」$data%formの内容をカンマ区切り形式で書き込む事が出来ます。こうすれば、長々と変数を並べないで済みますし、保存項目の修正も楽ですね。データの加工が必要な時は、一度フォームから送られてきた内容を別の連想配列(%dataなど)に記録して必要な加工を行い、同様の方法で%dataの内容を一気に書き出せば良いでしょう。


ディレクトリ内ファイルの全文検索

 いくつかのファイルを用意(あるいは任意に作成)しておいて、そのファイルの中から特定文字列を含むものをリストアップする「全文検索」は、応用範囲の広い処理です。この全文検索を行うためには、「検索対象ファイルの取得」と「個々のファイル内の検索」を行えば良いわけですね。今回は、「特定ディレクトリ内のファイル」に対して「正規表現対応の全文検索」をかけてみましょう。Perlでは簡単に正規表現のパターンマッチが出来るので、ファイルのリストが出来ればすぐに実現できてしまいます。

 まずディレクトリ内のファイルは、opendirでディレクトリをオープンしたあとreaddirを使うと配列にディレクトリ内の項目がまとめて取得できます。検索を行う時には配列の各要素に対してファイル検査の-fでファイルかどうかの判定を行い、ファイルなら検索文字列とのパターンマッチを行えば良いでしょう。

  opendir(DIR,$dir);
  @files=readdir(DIR);
  closedir(DIR);

 これで、配列@filesにディレクトリ$dir内の全項目が格納されました。あとは、

  @list=();

  foreach $d(@files) {

    if (-f $d) {

      open(F,"$dir$d");
      @dat=<F>;
      close(F);

      $text="";
      foreach $dd(@dat) {
        $text="$text$dd";
      }

      if ($text=~ /$key/g) {
        push(@list,$d);
      }

    }

  }

 として、ファイルに対して全文検索をかければ良いですね。これで、@list$keyを含むファイルのリストが作成されたので、"$dir$list[n]"とすればそのファイルのパスを取得できる事になります。


戻る