#!/usr/local/bin/perl asp <% $title = 'Apache::ASP 工作室'; use CGI qw/:all/; %> <% my @index = ( 'パターンマッチによる検索', 'CSV ファイルの、DBI 操作', 'XML における文字コード', 'Apache::ASP Tips', '...'); print div({-align=>'right'},'このページは、一部に' , b(a({-href=>'../../cgi.html'},'CGI.pm')) , ' を使っています。'), '以下、日本語での実例の、作成過程を順次掲載予定です。', ul (li [a({-href=>'#Patternmatch'},$index[0]), a({-href=>'#DBI'},$index[1]), a({-href=>'#XML'},$index[2]), a({-href=>'#Tips'},$index[3]), $index[4]]), hr({-width=>'80%'}); %>

<%=$index[0]%>

*[2002-05-01]→[2002-05-03追記]
オリジナルサイトは、検索可能で、ディストリビューションにある、 ./apps/search 以下のスクリプトが、そのプログラムと思うのですが、 先に、DB ファイルを作成しなければならないのか、エラーになります。 ファイル数から考えて、全文検索も大げさなので、 パターンマッチのみの、 簡単な検索システムを作ってみました。
大雑把に言うと、
  $ grep '何とか' *.html
のような、コマンド grep に似たサーチです。
Perl/CGI逆引き大全555の極意という ちょっと、大げさな題名の本から、それに見合ったスクリプトを ASP 用に変更します。
多重ループをまわし、ディレクトリ毎に、また、各ファイルに、grep をかけるという考え方です。 あらかじめ、配列として、@SearchDir と、@FileType (検索対象のファイルタイプ)に、セットしておきます。
  foreach $directory (@SearchDir) {
  opendir(S,"$directory");
  @searchFile = grep(!/^\./,readdir(S));
  close(S);
  foreach $filename (@searchFile) {
    foreach $type (@FileType) {
      if $filename =~ $type {
  (ファイルごとに内容を検索)
      ...
      }
    }
  }
という骨格です。
このスクリプトを、search.asp として、./docs-jp/apps-jp/mysearch に置くことにします。 まず、手始めに、同じディレクトリに、.htaccess は、ASP スクリプトとして、 動作するように、次のように設定します。
  
    SetHandler perl-script
    PerlHandler Apache::ASP
    PerlSetVar Global .
    PerlSetVar StateDir /tmp/asp_mysearch
    PerlSetVar Debug -3
    PerlSetVar IncludesDir .
    #PerlSetVar UseStrict 1
    PerlSetVar SessionSerialize 1
  
UseStrict 1 だと、グローバル変数の定義でエラーが続出するので(^^ゞ 今後の研究課題ということで、コメントアウトしました。 次に、global.asa に、
  sub getFormData{
    my($buffer,@pairs,%FORM,$name,$value);
    if ($ENV{'REQUEST_METHOD'} eq "POST"){
      read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    else {
      $buffer = $ENV{'QUERY_STRING'};
    }
    pairs = split(/&/,$buffer);
    foreach (@pairs) {
    ($name, $value) = split(/=/, $_);
    $value =~ tr/+/ /;
    $value =~ s/%(\w\w)/pack("C", hex($1))/eg;
    $value =~ s/</&lt;/g;
    $value =~ s/>/&gt;/g;
    $value =~ s/\r\n/\n/g;
    $value =~ s/\r//g;
    $FORM{$name} = $value;
    }
  return(%FORM);
  }

  # Jcode.pm を使って、
  # どんなコードでも、EUC-JP に変換
  sub toeuc {
    my($text) = @_;
    my($code,$nmatch) = getcode( \$text );
    return ( jcode($text,$code)->euc );
  }
と、関数を2つほど付け加えます。 前者は、Apache::ASP か、cgi.pm の実装を使えばと思いますが、ちょっと調べきれていません。 これまた、Perl/CGI逆引き大全555の極意の改変です。 <% my $searchScript = "../../docs-jp/apps-jp/mysearch/search.asp" ; %> その結果出来上がったのが、search.asp のソースです。 また実際に ASP という検索語を使い、検索を実行させます。 一部の特定の文字の検索のさい、文字化けします(^^ゞ EUC-JP のページは少なくとも、表示は正常のようです。 ループが、多重になっている割には、スピードも遅くなく、 リアルタイムの検索ができるので十分実用的と思っています。 今後は、生のままで出てくるタグなどを処理するのが課題です。HTML タグの処理もしてみました。その正規表現は、結構複雑みたいです。 HTMLタグの正規表現を使って、取り除いてみました。同ページの
  $tag_regex_ = ...
の部分です。 サブルーチンは、同ページのタグを削除するを利用しています。これで、生のスクリプトは出てきますが、ソース公開してるんだから、ま、これでいいっか。

<%=$index[1]%>

*[2002/05/08]
実は、ディストリビューション内に、CSV(コンマ区切りファイル)のサンプルがあります。ネット上で、各自のブックマークを実現させる簡単な実例です。この実例もタイトルなど日本語化して掲載しました。→ブックマーク実例です。使い方は難しくないと思います。自由に利用していただいて結構です。 トラブルがあるようなら断りなしに撤去します。 でもなぜか、Mozilla 0.9.8 あたりだとうまくいかない。 IE、Opera あたりは OKのようです。 これらのスクリプトのソースです。 index.asp および、 bookmarks.asp
このように、DBD::CSV モジュールを使って、 CSV ファイルへの問い合わせを実現しています。 そこで、日本語実例として、 CSV 保存したこのマニュアル文書翻訳での訳語集への アクセススクリプトを作成します。出来あがったのが、 訳語対照表です。 データベース検索システムの基本は、選択表示、追加、修正、削除の4つと思います。 あとの3つは、その検索の利用ポリシーによるものですが、 順に、DBI および DBD::CSVの骨格を示します。
  • 選択表示
    まず、global.asa に use File::Basename; use File::Copy; use DBI;
  • 選択表示
(この項の以下は準備中)

<%=$index[2]%>

*[2002/05/15]
XML/XLST はそれ自体の複雑さに加え、日本語を扱う上で、文字コードの多様さに辟易します。また、一般的には、XML アプリケーションサーバもおおがかりなインストールと設定が必要なものが多く、XML はちょっと敬遠ぎみでした。Apache::ASP での、XML の取り扱いは、変換の定義づけの XLST ファイルを、.htacess への記載が必要など独自の拡張がされている面もありますが、比較的簡単に、XML パーシングサーバになりうると感じました。日本語文字コードを扱うためには、私のインストールメモでの、「XML Parser のインストールと日本語コードの設定」をご覧ください。これらのツールを使用して、オリジナルサイトの XML 実例を、和訳してみました。また、XML/XLST の文字コードとパーサでの有効性の関係を、XMLで表にまとめてみました。

<%=$index[3]%>

*[2002/05/01]
Apache::ASP 以外に、HTML 内に、Perl スクリプトを埋め込むソリューションを、2,3 挙げておきます。 上記は現在のところ、インストールしていない/できないので、詳細は調べていません。 タグにも特色があり、[ ] や、<? !> などあるようです。 また、Ruby にも、mod_ruby+eruby があり、こちらの方が軽そう? 結局、Apache::ASP は限りなく、(良し悪しは別にして) ASP っぽくというのが、特色でしょうか?

*[2002/05/03]
インストールに関して SUGAWARA さんから以下の情報をいただきました。ありがとうございます。
・mod_perlのインストールはCPANモジュールを使って
        cpan> o conf makepl_arg 'USE_APXS=1 EVERYTHING=1'
        cpan> install mod_perl
  とするのが楽かもしれない。

・Win32のApahce + ActivePerlでも
        ppm install http://theoryx5.uwinnipeg.ca/ppmpackages/mod_perl.ppd
  としてmod_perlを入れれば動くらしい(未確認)
<% print hr({-width=>'80%'}); %>