CGIのための

実践入門Perl

追捕版


(ご注意)
このページをA4サイズで印刷する場合、表が適切に印刷されませんので横位置を指定してください。

<サンプルスクリプト使用上の注意点>

コマンドラインでサンプルスクリプトがうまく実行できない場合:
 
 エラーメッセージの内容をチェックします。

 例)
【症状】

・MS-DOSプロンプトで「コマンドまたはファイル名が違います」というメッセージが出る時:


【原因】
        perl実行プログラムのパスがうまく設定されていません。

【対応策】
        autoexec.bat(Win95/98)、コンパネのシステム(NT)、#!行(UNIX系)のパス
        を正しく設定します。

perl実行プログラムのパスが通っているかどうかは以下で確認できます。
      > perl -v
【症状】
・MS-DOSプロンプトで「Can't open perl script "xxx.pl":No such file or directory
などのメッセージが出る時:
【原因】

        指定したスクリプトがperlの検索パスが通っている場所にありません。

【対応策】
 

 例えば、CD-ROMのSampleディレクトリからhello.plファイルをperl.exeのあるC:\perl\binに コピーし、MS DOSプロンプトから
        C:\WINDOWS>perl hello.pl
とした場合、通常エラーとなります。 C:\perl\binは実行ファイルperl.exeの探すための検索パスですが、通常これは スクリプトファイルの検索パス(@INC)には入っていません。
カレントディレクトリは「C:\WINDOWS」です。 この場合、hello.plはフルパス(\Perl\bin\hello.pl)ではないので、perlは、
  perl -V
の最後に出力される@INC中のディレクトリ群を検索します。 通常このディレクトリ群には、(カレントディレクトリを示す)「.」が 入っていますが、上記のケースではhello.plは\Perl\bin\hello.plにあり、 カレントディレクトリにはありません。(カレントディレクトリは「C:\WINDOWS」です。) ということで、「そんなファイルはない」というメッセージが出るわけです。

対策としては

1.フルパスで指定する。
        C:\WINDOWS>perl \Perl\bin\hello.pl

2.スクリプトファイルを置いているディレクトリにカレントディレクトリを変更する
        C:\WINDOWS>cd \Perl\bin
        C:\Perl\bin>perl hello.pl

3.Perlの検索パス(\libで表されるライブラリディレクトリ:
  この場合、C:\PERL\lib、C:\PERL\site\lib など)にスクリプトファイル(hello.pl)を置く
が考えられます。
3.でもよいのですが、あまり繰り返すとどれがオリジナルのファイルで どれが自分がテストしたファイルかわからなくなることがあるので、 2.がオススメでしょう。 
その他、Perl初心者のFAQのページ にもいろいろな事例が掲載されているので、参照してください。


◆サンプルCGIがうまくいかない場合:

●WWW会議室関係

【症状】
新規投稿時、メールホストエラーが発生する。
        メールホストエラー

        メールアドレスが確認できませんでした。

<石本さんに感謝>
【原因】
このCGIスクリプトでは、メールアドレスのドメインの簡易チェックとして、 対応するホストがあるかどうか確認しています。しかし、近年 急増したISPやホスティング・サービス等では、一般にメールアドレスのドメイン名には 実ホスト名ではなく、MX用に登録されたドメイン名が使用されています。 また、通常のサイトでも同様のDNS設定をしているところもあり、 そのようなアドレスが書き込まれると実ホストではないので、上記のようにエラーと なります。


【対策】

お手数ですが、CGIファイルwwwboard_entry.cgiの下記elsif節の部分をコメント化してご利用ください。
 
        # elsif (($hostname = $email) =~ s/.+\@(\S+)/$1/) {
        #       ($hname, $aliases, $addresstype, $length, @address) =
        #               gethostbyname $hostname;
        #       if (not $hname){
        #               &CgiError( "メールホストエラー",
        #               "メールアドレスが確認できませんでした。");
        #       exit;
        #       }
        # }
 
実用的なメールアドレスのチェック方法については、CGIプログラミングテクニックのTips を参照してください。
 

◆wwwboard-entry.cgi 等の設定がうまくいかないケースについて

【症状】
WWWでinternel Server Error が出る。


【原因】

(1)use Kconv がうまく機能してない。
(2)パスの設定が間違っている。
(3)パーミッションがうまく設定されていない。
等が考えられます。


【対策】

(1)のuse Kconv がうまく機能してない場合、 コマンドラインから./wwwboard-entry.cgi とすると、次のようなエラーメッセージが出るはずです。
        Can't locate auto/Kconv/autosplit.ix in @INC (@INC contaains:
        /usr/local/lib/perl5  /usr/local/lib/perl5/5.00502/i386-Freebsd
        /usr/local/lib/perl5/5.00502

これはライブラリにKconvモジュールがインストールされていないためです。
以下のように(A)Kconvをインストールするか、(B)下記のようにスクリプトを修正してください。
(A)Kconvのインストール(UNIXの例)
 
 (a) まず、Kconvのディストリビューションを展開します。
        % cd /usr/local/src
        % tar zxvf Kconv-1.1.tar.gz
        (または、gzip -cd < /tmp/Kconv-1.1.tar.gz | tar xf -)

(b) これからPerlをインストールする場合は、Perlを展開します。
        % tar zxvf perl5.003_03.tar.gz
        (% gzip -cd < ./perl5.002.tar.gz | tar xf -)

(c) 展開してあれば、Perlのディストリビューションを展開したディレクトリの下のにextにKconv-1.1/Kconvを移動します。
        % mv Kconv-1.1/Kconv perl5.005_03/ext

(d) あとは通常のPerlのインストールと同じです。
        % cd perl5.003_02
        % ./Configure
        % make
        # make install

(注)dynamic loading または static loading で Kconv が指定されていることを確認しておいてください。

(B)CGIのスクリプトを修正する場合、下記のようにしてください。
6行目
 use Kconv;


をコメントにして(# use Kconv;)

        require "jcode.pl";
を追加してください。

59-60行目

        #### 文字コード変換
        &tosjis($body);
        &tosjis($name);
をコメントにして、次のように追加してください。

        &jcode'convert(*body, 'sjis');
        &jcode'convert(*name, 'sjis');

SJISではなく、EUCを使用する場合、
        &jcode'convert(*body, 'euc');
        &jcode'convert(*name, 'euc');
となります。
(2)のindex.cgi、wwwboard-entry.cgi などの初期設定パスの設定が間違っていると思われる場合は、以下を参考にして再設定してください。
◆index.cgi の設定要領
設定項目
種別
設定内容
$messagedir = '/your_message_dir/';
絶対パス
各記事のファイルや記事のインデクスファイルを格納するディレクトリ。/home/username/public_html/wwwboard/等。 WWWサーバが書き込みできるパーミッションが必要。(読み取り、実行も必要)
use lib '/your_lib';
絶対パス
cgi-lib.plなどを格納しているディレクトリの絶対パス。ただし、perl -Vで表示される@INCの 標準的ライブラリディレクトリに格納している場合は不要なので、コメントにしてください。
require 'cgi-lib.pl';
 
上記のuse lib 'xxx';を設定した場合、またはcgi-lib.plを@INCの 標準的ライブラリディレクトリに格納している場合は、このままでOKです。
use lib 'xxx';を設定しない場合、あるいは、cgi-lib.plを格納しているディレクトリがカレントディレクトリや@INC内のパスではない場合は、絶対パスで指定する必要があります。
$newpostfile = '/wwwboard/post.html';
URL
/wwwboardは、WWWサーバでHTML文書を格納している任意の仮想ディレクトリで 構いません。
$indexfile = $messagedir . "subject.txt";
絶対パス
$messagedirが適切にセットされていれば、設定不要。
$homepageurl = "/";
URL
ホームページを示すURL。
$WWWBoardURL = "/wwwboard/index.html";
URL
電子会議室のトップページをセットするURL。/wwwboardは、WWWサーバでHTML文書を格納している任意の仮想ディレクトリで 構いませんが、$newpostfileと同じ仮想ディレクトリとしなければなりません。
$messageurl ="/wwwboard/messages/";
URL
各記事を格納しているURL。/wwwboardは、WWWサーバでHTML文書を格納している任意の仮想ディレクトリで 構いませんが、$newpostfileと同じ仮想ディレクトリとしなければなりません。
$actionpgm = "/cgi-bin/index.cgi";
URL
index.cgiのURL。
◆wwwboard-entry.cg の設定要領
 
設定項目
種別
設定内容
use lib '/your_lib'; 絶対パス cgi-lib.plなどを格納しているディレクトリの絶対パスをセットします。ただし、perl -Vで表示される@INCの 標準ライブラリディレクトリに格納している場合は不要なので、コメントにしてください。
require 'cgi-lib.pl';    
use Kconv;   Kconvモジュールがインストールされていない場合、コメントにします。上記「use Kconv がうまく機能してない場合」を参照。
$messagedir = '/your_message_dir/';  絶対パス 各記事のファイルや記事のインデクスファイルを格納するディレクトリ。/home/username/public_html/wwwboard/等。 WWWサーバが書き込みできるパーミッションが必要です。(読み取り、実行権も必要)
index.cgiで設定した$messagedirと同じディレクトリでなければなりません。
$idfile = $messagedir . 'id.txt'; 絶対パス $messagedirが適切にセットされていれば、設定不要。
$indexfile = $messagedir . "subject.txt";  絶対パス $messagedirが適切にセットされていれば、設定不要。
$homepageurl = "your_home_page";  URL ホームページを示すURL。
$WWWBoardURL = "/wwwboard/index.html";  URL /wwwboardは、WWWサーバでHTML文書を格納している任意の仮想ディレクトリでも 構いませんが、 index.cgiで設定した$newpostfileと同じディレクトリにしなければなりません。
$entry_pgm = "/cgi-bin/wwwboard-entry.cgi"; URL wwwboard-entry.cgiを格納しているURL。
$admin_pgm ="/cgi-bin/wwwboard-entry.cgi";  URL wwwboard-entry.cgiを格納しているURL。
(3)のパーミッションについて:
 WWWサーバ等の設定に依存します。所有者権限だけではよいケースもあります。しかし、ISP等では、インストールしたディレクトリ、各スクリプトファイル、データを書き込むファイルを、WWWサーバを実行しているユーザ(UNIXベースのISPだとnobodyやwww等、MS-IIS/PWSだとIUSER_xxxxx)がアクセス可能な設定にする必要があるケースもあります。それぞれの環境で再確認してみてください。下記は、標準的なパーミッションの設定例です。
  wwwboard/         [読込・書込・実行権限]
   ├---index.html     [読込権限]
   ├---blank.html     [読込権限]
   ├---post.html      [読込権限]
   └messages/       [読込・書込・実行権限]
    ├id.txt        [読込・書込権限]
    ├subject.txt     [読込・書込権限]
    └nnn.html       [読込・書込権限]

  cgi-bin/
   ├---index.cgi      [実行権限]
   └---wwwboard-entry.cgi [実行権限]

ホームページ]  [講演・セミナー]  [サービス]  [トピックス]  [書籍


Copyright (C) 1997-1998, Ark Think Tank. All rights reserved.

お問い合わせ等は info@att.or.jp にE-Mailでお寄せ頂くか、こちらの連絡先までお問い合わせ下さい。