
(ご注意)
このページをA4サイズで印刷する場合、表が適切に印刷されませんので横位置を指定してください。
Windows向けの バイナリー・ディストリビューションについては、 standard版(GS版)とActiveState版(AS版)が統合されたActivePerlが
リリースされています。 Windows向けの詳細は
こちらを参照してください。
サーバがNT+IIS/PWSやApacheの場合、CGI_Liteモジュールを修正する必要があります。また、NTの追加設定が必要になることもあります。詳しくは下記関連記事のリンクを参照してください。
誤植と関係ない場合、あるいは、正しく修正された後もうまく動かない場合、サンプルスクリプト使用上の注意点 を参照してください。
例えば、P.279のguestbook.cgiを例に取ると、
use lib "yourlib_dir"; $workdir = "/temp/"; $targetfile = "/fullpath/guestbook.html"; $guestbookurl = "/your-url/ guestbook.html";には、それぞれ自身の使用環境に応じた実在するパス(ディレクトリ/URL)を セットします。また、ディレクトリの前にドライブ名を付けます。
例) use lib "c:/perl/mylib"; # cgi-lib.plを置いているディレクトリ $workdir = "c:/temp/"; $targetfile = "c:/InetSrv/wwwroot/guestbook.html"; $guestbookurl = "/guestbook.html";guestbook.cgiで、『 現在書き込みができなくなっています。しばらくして、もう一度送信してください 。at /perl/lib/cgi-lib.pl line 431』 のようなメッセージが出る件は次のURLを参照してください。
CGIスクリプトの記述例) use CGI_Lite; $cgi = new CGI_Lite; (略) $cgi->add_timestamp(0); (略) add_timestampメソッドの引数の意味は次のようになっています。 0 = タイムスタンプなし 1 = タイムスタンプとファイル名(デフォルト) 2 = 同じファイルがあればタイムスタンプだけにする。 CGI_Lite.pmの中にも記述してあると思いますので、確認してみて下さい。
<三原 弘さんに感謝>
と記述してありますが、書き方が悪く「文字長」の機能とも捉えられます。
意味しているのは、 オフセットとの関係から、 指定した「文字長」がオフセットの位置や「対象文字列」の先頭より前の部分、
あるいは、末尾よりも後ろの部分だけを示している場合、 空文字列が返される、ということです。
例示すると、次のような場合、それぞれ空文字列が返されます。
$str1 = substr("0123456789", 0, -12); # 先頭より前の部分を示す
$str2 = substr("0123456789", 9, 2); # 末尾よりも後ろの部分を示す
$str3 = substr("0123456789", 8, -4); # 開始位置よりも前の部分を示す
<INPUT TYPE=TEXT NAME="yourname">となっているのに対し、CGIスクリプトでは
($parameter, $name) = split /=/, $in;で$parameter, $nameにパラメータ名yournameと入力した値がセットされ、 もとのHTMLソースの"yourname" はCGIスクリプトのどこにも出てこない。 という疑問がある方もおられるかもしれません。
これは、送信ボタンが押された時点で、ブラウザの入力フィールドに入れられたデータが、 「yourname=Mishima」という形式でブラウザからWWWサーバに送られ、 WWWサーバで環境変数CONTENT_LENGTHにセットされます。そして、CGIスクリプトを起動します。 WWWサーバから起動されたCGIスクリプトでは、 その前のread文で、環境変数CONTENT_LENGTHに入っている「yourname=Mishima」 を取り出し、変数$inに代入しています。そして、
($parameter, $name) = split /=/, $in;で、$inの値yourname=Mishimaを=で分割して取り出して、それぞれ$parameterと$nameに 代入しているのです。
少々見落とし、誤植がありました。申し訳ありません。版によっては修正されていることがあります。
|
|
|
|
|
|
|
| P32 | 中ごろ | Chop | chop | ||
| P36 | mishma | mishima | |||
| 99.10.28 | P39 | 図 | pass2
pass3 |
pass3
pass4 |
<島田聖一さんに感謝> |
| 99.10.28 | P40 | 図 | pass2
pass3 |
pass3
pass4 |
<島田聖一さんに感謝> |
| P78 | この手順は、Win32用バイナリー配布キットperl5.004_02-bindist-bcではサポートされていますが、
Perl for Win32ではサポートされていません(GS版)。 |
この手順は、Win32用バイナリー配布キットperl5.004_02-bindist-bc(GS版)ではサポートされていますが、
Perl for Win32ではサポートされていません。 |
|||
| P86 | 中頃 | \の前に\が付いていても | \の前に\が付いていれば | ||
| P98 | 最下行 | (q//,q//など) | (q//,qq//など) | ||
| P98 | 表中
notの結合則 |
左結合 |
右結合 | ||
| P107 | 4行目 | # 3-2すなわちインデクスが1の要素5を代入 | # 3-2すなわちインデクスが1の要素6を代入 | ||
| P110 | 最下行 | @array = reverse @arrayz | @array = reverse @array | ||
| P122 | 下から7行目 | } elsif ($x = 50) { | } elsif ($x == 50) { | <小倉一朗さんに感謝> | |
| P150 | 3.8.2 文字列の取り出し | 部分文字列の取り出しは正規表現でも可能ですが、substr関数を使う手もあります。 | 部分文字列の取り出しは正規表現を使ったパターンマッチ関連の演算子でも可能ですが、substr関数を使う手もあります。 | ||
| P172 | 表
モード 機能 |
3 ロック中非ブロック | 4 ロック中非ブロック | ||
| P194 | 上部 | カレントディレクトリを表す「.」(ドット)が欠落。 | |||
| P227 | 15行目 | 3.8.6 文字列の分解とリストの結合〜splitとjoinの参照 | 3.7.6 文字列の分解とリストの結合〜splitとjoinの参照 | <山田 与史明さんに感謝> | |
| 01.8.24 | P.240 | user.html内 | ACTION="cgi-bin/cgi_user.pl" | ACTION="cgi-bin/usercheck.pl" | <tintreeさんに感謝> |
| 99.9.17 | P.241 | コラム:URLエンコーディング | 特殊文字%と | 特殊文字は%と | <山田 与史明さんに感謝> |
| P255 | 1行目 | ファイルロック | ロックファイル | ||
| P265 | imgtag-counter1.cgi の中頃 |
if ($in{'column'} ==1) {
++$count; |
++$count; if ($in{'column'} ==1) {
|
CD-ROM添付のサンプルも修正が必要です。 | |
| 99.8.31 | P270 | 上から15行目
index.cgi中 |
$mon += 1; | $t_mon += 1; | CD-ROM添付のサンプルも修正が必要です。
<s-hamanaさんに感謝> |
| P278 | 下から3行目guestbook.html の下から2行目 | <!--NEWPOINT-->
</FORM></BODY></HTML> |
<!--NEWCOMMENT-->
</FORM></BODY></HTML> |
CD-ROM添付のサンプルも修正が必要です。 | |
| P278 | 下から3行目 | <!--NEWPOINT--> | <!--NEWCOMMENT--> | CD-ROM添付のサンプルも修正が必要です。 | |
| P279 | 1行目 | <!--NEWPOINT-->は追加コメントを挿入する位置 | <!--NEWCOMMENT-->は追加コメントを挿入する位置 | ||
| P279 | if (not $in{'name'}){
&CgiError("名前の記入がありません。", "ブラウザのバックボタンで戻って再入力してください。") } elsif (not $in{'body'}){ &CgiError("本文の記入がありません。", "ブラウザのバックボタンで戻って再入力してください。") } |
if (not $in{'name'}){
&CgiError("名前の記入がありません。", "ブラウザのバックボタンで戻って再入力してください。"); exit; } elsif (not $in{'body'}){ &CgiError("本文の記入がありません。", "ブラウザのバックボタンで戻って再入力してください。"); exit; } |
CD-ROM添付のサンプルも修正が必要です。 | ||
| P279 | 下部 | "お手数ですが<A HREF=\"mailto:xx@xxx\">当方</A>までご連絡ください。" | "お手数ですが<A HREF=\"mailto:xx\@xxx\">当方</A>までご連絡ください。" | @の前に\を追加 | |
| 99.11.12 | P290 | open MAIL, "$mailprogram $maddress" | open MAIL, "$mailprogram $myaddress" | ||
| 00.10.26 | P294 | アクセスログを取る
のサンプル |
$ENV{'REMOTE_ADDR}
$ENV{'REMOTE_HOST} $ENV{'HTTP_USER_AGENT} |
$ENV{'REMOTE_ADDR'}
$ENV{'REMOTE_HOST'} $ENV{'HTTP_USER_AGENT'} |
<横田拓也さんに感謝> |
| P412 | ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/
src/5.0/jperl/Hirofumi_Watanabe// ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/
|
ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/
src/5.0/jperl/Hirofumi_Watanabe/ ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/
|
|||
| P413 | Randla L.Schwartz | Randal L.Schwartz | |||
| P415 | 下部 | fj.net.infosystem.www.* | fj.net.www.* | ||
| P416 | 上部 | ListMangager@ActiveState.com
Perl-Win32-J@ActiveState.com |
Lyris@ActiveState.com
Perl-Win32-J@Lyris.ActiveState.com |
||
| P417 | 1行目 | ●Apache関係 | ●CGI関係 | ||
| P417 | http'//forest.ne.jp/cgi-ml/ | http://forest.ne.jp/cgi-ml/ |
if ($in{'column'} ==1) {
++$count;
【不具合点】
【対応方法】
++$count;
if ($in{'column'} ==1) {
【対応方法】
<HTML><HEAD><TITLE>ゲストブック</TITlE></HEAD> <BODY>
(変更)
<HTML> <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<HEAD><TITLE>ゲストブック</TITlE></HEAD>
<BODY>
◆ページの下から3行目
ファイルの19行目(下から2行目)
<小柳 博文さんに感謝>
【対応方法】
(誤)
<!--NEWPOINT-->
(正)
<!--NEWCOMMENT-->
if (not $in{'name'}){
&CgiError("名前の記入がありません。",
"ブラウザのバックボタンで戻って再入力してください。")
} elsif (not $in{'body'}){
&CgiError("本文の記入がありません。", "ブラウザのバックボタンで戻って再入力してください。")
}【不具合点】
[対応方法]
◆ファイルの39行目から
open GUESTBOOK, "<$targetfile" or
&CgiDie("現在処理ができなくなっています。",
"お手数ですが<A HREF=\"mailto:xx@xxx\">当方</A>までご連絡ください。",
"<A HREF=\"$guestbookurl\">来訪帳</A>に戻る");
[不具合点]
[対応方法]
[対応方法]
(誤)
(添付cgi-lib.plファイル)
オリジナルは、 http://cgi-lib.stanford.edu/cgi-lib/にあります。
念のため、ここにも、ダウンロードしたコピー(V2.17)を置いておきます。
6〜7行目
open IMG, "$imagefile" ■ or die "$imagefileをオープンできませんでした。\n"; ^^■の位置(7行目の最初の文字)に日本語文字のスペースが入り込んでいるものがあります。 お手数ですが削除して使用して下さい。
sub lock3 {
while (!symlink('.', $lockfile)) {
■ if (--$retry == 0) {
&timeout; # タイムアウト処理(強制終了)
}
sleep 1;
}
■ return 1;
}
print■"</BODY></HTML>"; __END__
エラーメッセージの内容をチェックします。例)
【症状】・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プロンプトからその他、Perl初心者のFAQのページ にもいろいろな事例が掲載されているので、参照してください。C:\WINDOWS>perl hello.plとした場合、通常エラーとなります。 C:\perl\binは実行ファイルperl.exeの探すための検索パスですが、通常これは スクリプトファイルの検索パス(@INC)には入っていません。
カレントディレクトリは「C:\WINDOWS」です。 この場合、hello.plはフルパス(\Perl\bin\hello.pl)ではないので、perlは、の最後に出力される@INC中のディレクトリ群を検索します。 通常このディレクトリ群には、(カレントディレクトリを示す)「.」が 入っていますが、上記のケースではhello.plは\Perl\bin\hello.plにあり、 カレントディレクトリにはありません。(カレントディレクトリは「C:\WINDOWS」です。) ということで、「そんなファイルはない」というメッセージが出るわけです。perl -V対策としては
が考えられます。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.がオススメでしょう。
◆サンプルCGIがうまくいかない場合:
(2)上記にも記載しましたが、CD-ROM添付のcgi-lib.plが破損している場合があります。 破損しているかどうかは、cgi-lib.plの置いてあるディレクトリで、下記のようにコマンド入力すれば判定できます。以下は、破損している場合のエラーメッセージです。
>perl -wc cgi-lib.pl Can't use subscript on subroutine entry at cgi-lib.pl line 114, near "$key}" (Did you mean $ or @ instead of &?) cgi-lib.pl had compilation errors. 問題ない場合は、以下のようなメッセージが返ります。>perl -wc cgi-lib.pl cgi-lib.pl syntax OK
(3)CD-ROM添付の、あるいは掲載されているサンプルスクリプトを使用する際は、 CGIスクリプト内で設定してある各ファイルへのパス、URL、およびHTMLファイルの CGIスクリプトへのURL、ファイル名等を自分の環境に合わせて修正して、実行して ください。 そのままではうまく動きません。
(4)各ファイル、ディレクトリのパーミッションを確認してください。更新されるファイルおよびそれらを置いてあるディレクトリについては、WWWサーバが書き込み可能である必要です。
(5)変更を加えたCGIスクリプトファイルに文法エラーがないかチェックします。
>perl -wc xxx.cgi
xxx.cgi syntax OK
(6)WWWサーバでの実行時のエラーメッセージ等を補足する方法等のデバッグ方法については、CGI等Perlスクリプトのデバッグ方法
を参照してください。
(7)BIGLOBEでCGIを利用されている方へ
【症状】新規投稿時、メールホストエラーが発生する。【原因】メールホストエラー メールアドレスが確認できませんでした。 <石本さんに感謝>この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 とすると、次のようなエラーメッセージが出るはずです。(A)Kconvのインストール(UNIXの例)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のディストリビューションを展開します。(B)CGIのスクリプトを修正する場合、下記のようにしてください。% 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 が指定されていることを確認しておいてください。6行目(2)のindex.cgi、wwwboard-entry.cgi などの初期設定パスの設定が間違っていると思われる場合は、以下を参考にして再設定してください。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');となります。◆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 [実行権限]
お問い合わせ等は info@att.or.jp
にE-Mailでお寄せ頂くか、こちらの連絡先までお問い合わせ下さい。