「これからはじめるPerl&CGI入門ゼミナール」(初版第1刷)正誤表


※Apache for Win32の使用について
Windows版Apache(1.3.24以前)にSSIのバグがあり,「#exec cmd」にてCGIプログラムが起動できません(ブラウザがストールする)。UNIX版Apacheでは問題ありません。 回避方法を以下に示します。ただし,2番目の方法ではCGIプログラムにHTTPヘッダ出力を加える必要があります。
  1. <!--#exec cmd="perl CGIプログラム名"-->
  2. <!--#exec cgi="CGIプログラム名"-->
例えば,「test.cgi」というCGIプログラムの場合だと, と記述します(1番目の方法)。

※Webサーバの種類
第2章において,パソコン上にWebサーバを構築する方法を紹介していますが,Webサーバは「AnHttpd」や「Apache」のいずれかお好きなほうを選択してください。共存させないほうが無難です。

※コマンドプロンプト(MS-DOSプロンプト)の起動方法
本文中,コマンドプロンプト(MS-DOSプロンプト)に関する説明が登場しますが,OSにより起動方法が異なります。
  1. Windows98/ME … 「スタートメニュー」−「プログラム」から「MS-DOSプロンプト」を起動する。
  2. Windows2000/XP … 「スタートメニュー」−「ファイル名を指定して実行」から「cmd.exe」と入力する。

※コマンドプロンプト(MS-DOSプロンプト)の使い方
コマンドプロンプト(MS-DOSプロンプト)の使い方について簡単に説明します。エクスプローラとは違って,操作はすべてキーボードで行います。コマンドプロンプトを起動すると,カーソルが点滅していますが,それは「コマンドの入力待ち」であることを示しています。基本的に各種コマンドを入力し,リターンキーを押下することで,コマンドを実行することができます。以下では,よく使われるコマンドについて紹介します。なお,コマンドに大文字・小文字の区別はありません。 例として,本書74ページにあるように,コマンドプロンプトを起動して,Dドライブの \usr\kiji\cgibook\image4 ディレクトリにある list1.pl というPerlプログラムを実行する手順を以下に示します。

箇所
まえがき 自分でCGIプログラミングを作って設置している人は 自分でCGIプログラムを作って設置している人は
1-1節リード文(10ページ) 情報を得たりインタラクティブなホームページを実現できます 読者から情報を得られるインタラクティブなホームページを実現できます
1-4節(20ページ) C++のデメリット C/C++のデメリット
2-3節(34ページ) ここで、ActivePerlの時と同じ注意点があります(30ページ参照) ここで、ActivePerlの時と同じ注意点があります(29ページ参照)
2-3節(44ページ) この記述が間違っているCGIプログラムの起動は失敗します この記述が間違っているとCGIプログラムの起動は失敗します
4-2節(74ページ) [List1] list1.cgi [List1] list1.pl
4-3節(77ページ) また、実行したくないスクリプトも行頭に#を付けて書いておくと便利なこともあります。 また、実行したくないスクリプトも行頭に#を付けて書いておくと便利なこともあります。
4-9節(105ページ) 変数の内容がある数値より大きいどうかチェックしたい 変数の内容がある数値より大きいかどうかチェックしたい
4-9節(117ページ) while文の以下の流れで繰り返し処理を行います while文は以下の流れで繰り返し処理を行います
4-10節(131ページ) ※アンダースコア欠落
sub test func {
    print "関数test funcが呼ばれました\n";
}

print "関数を呼び出します\n";

&test func();
test func();
test func;
&test func;

−−−−−−−−−−−−−−−−

関数を呼び出します
関数test funcが呼ばれました
関数test funcが呼ばれました
関数test funcが呼ばれました
関数test_funcが呼ばれました

sub test_func {
    print "関数test_funcが呼ばれました\n";
}

print "関数を呼び出します\n";

&test_func();
test_func();
test_func;
&test_func;

−−−−−−−−−−−−−−−−

関数を呼び出します
関数test_funcが呼ばれました
関数test_funcが呼ばれました
関数test_funcが呼ばれました
関数test_funcが呼ばれました
4-10節(132ページ) ※アンダースコア欠落
sub show heisei {
    local($year) = @ ;

    $n = $year - 1988;
    print "西暦 $year 年は平成 $n 年です\n";

}
&show heisei(2001);
&show_heisei(2002);

sub show_heisei {
    local($year) = @_;

    $n = $year - 1988;
    print "西暦 $year 年は平成 $n 年です\n";
}
&show_heisei(2001);
&show_heisei(2002);
4-10節(133ページ) ※アンダースコア欠落
sub show heisei {
    local($year) = @ ;

    $n = $year - 1988;
    return ($n);
}

$ret = &show heisei(2001);
print "西暦 2001 年は平成 $ret 年です\n";

$ret = &show heisei(2002);
print "西暦 2002 年は平成 $ret 年です\n";

sub show_heisei {
    local($year) = @_;

    $n = $year - 1988;
    return ($n);
}

$ret = &show_heisei(2001);
print "西暦 2001 年は平成 $ret 年です\n";

$ret = &show_heisei(2002);
print "西暦 2002 年は平成 $ret 年です\n";
4-10節コラム(134〜135ページ) ※アンダースコア欠落
for ($i = 0 ; $i < 10 ; $i++) {
    print "\$i = $i\n";
    $ret = &power($i);
    print "$ret\n";
}


sub power {
    local($val) = @ ;

    $i = $val * $val;
    return ($i);
}

−−−−−−−−−−−−−−−−

for ($i = 0 ; $i < 10 ; $i++) {
    print "\$i = $i\n";
    $ret = &power($i);
    print "$ret\n";
}


sub power {
    local($val) = @ ;
    my($i); ←追加

    $i = $val * $val;
    return ($i);
}

for ($i = 0 ; $i < 10 ; $i++) {
    print "\$i = $i\n";
    $ret = &power($i);
    print "$ret\n";
}


sub power {
    local($val) = @_;

    $i = $val * $val;
    return ($i);
}

−−−−−−−−−−−−−−−−

for ($i = 0 ; $i < 10 ; $i++) {
    print "\$i = $i\n";
    $ret = &power($i);
    print "$ret\n";
}


sub power {
    local($val) = @_;
    my($i); ←追加

    $i = $val * $val;
    return ($i);
}
5-1節コラム(146ページ) また、<<の直後の終端文字列は必ず引用符で囲むということです。 また、<<の直後の終端文字列は必ず引用符で囲むということです。
5-2節(151,156ページ) <!--\exec cmd="./CGIプログラム名"--> <!--#exec cmd="./CGIプログラム名"-->
5-2節(156ページ) <!--\exec cgi="./CGIプログラム名"--> <!--#exec cgi="./CGIプログラム名"-->
5-3節(163ページ) ※アンダースコア欠落
#! /usr/local/bin/perl

$method = $ENV{'REQUEST METHOD'};

if ($method eq 'POST') {
read(STDIN, $buf, $ENV{'CONTENT LENGTH'});
} elsif ($method eq 'GET') {
$buf = $ENV{'QUERY STRING'};
}


print "Content-type: text/html\n\n";

print "メソ\ッドは $method 
\n"; print "受け取ったデータは $buf\n";

#! /usr/local/bin/perl

$method = $ENV{'REQUEST_METHOD'};

if ($method eq 'POST') {
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} elsif ($method eq 'GET') {
$buf = $ENV{'QUERY_STRING'};
}


print "Content-type: text/html\n\n";

print "メソ\ッドは $method 
\n"; print "受け取ったデータは $buf\n";
5-3節(168ページ) 丸括弧で囲ってあるので、この正規表現でマッチした文字列を 丸括弧で囲ってあるのは、この正規表現でマッチした文字列を
5-3節(169ページ) ※アンダースコア欠落
#! /usr/local/bin/perl

$method = $ENV{'REQUEST METHOD'};

if ($method eq 'POST') {
read(STDIN, $buf, $ENV{'CONTENT LENGTH'});
} elsif ($method eq 'GET') {
$buf = $ENV{'QUERY STRING'};
}

#! /usr/local/bin/perl

$method = $ENV{'REQUEST_METHOD'};

if ($method eq 'POST') {
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} elsif ($method eq 'GET') {
$buf = $ENV{'QUERY_STRING'};
}
5-3節(171ページ) ※アンダースコア欠落
#! /usr/local/bin/perl

$method = $ENV{'REQUEST METHOD'};

if ($method eq 'POST') {
read(STDIN, $buf, $ENV{'CONTENT LENGTH'});
} elsif ($method eq 'GET') {
$buf = $ENV{'QUERY STRING'};
}

$buf =~ tr/+/ /;
$buf =~ s/%([a-fA-F0-9][a-fA-F0-9])/
                   pack("C", hex($1))/eg;

print "Content-type: text/html\n\n";

print "メソッドは $method 
\n"; print "受け取ったデータは $buf
\n";

#! /usr/local/bin/perl

$method = $ENV{'REQUEST_METHOD'};

if ($method eq 'POST') {
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} elsif ($method eq 'GET') {
$buf = $ENV{'QUERY_STRING'};
}

$buf =~ tr/+/ /;
$buf =~ s/%([a-fA-F0-9][a-fA-F0-9])/
                   pack("C", hex($1))/eg;

print "Content-type: text/html\n\n";

print "メソッドは $method 
\n"; print "受け取ったデータは $buf
\n";
6-4節(193ページ) ノンブロックロック(ロックに失敗したても待たない) ノンブロックロック(ロックに失敗しても待たない)
6-4節(198ページ) ※List6のプログラムを動作させるには,「count.txt」というファイルをあらかじめ同じディレクトリに置いておく必要があります。count.txtの内容は空でOKです。
6-5節(206ページ) 次に来た人がロックが取得できないという 次に来た人がロックを取得できないという
8-1節(291ページ) $ARGV[n] 第(n-1)引数の内容 $ARGV[n] 第(n+1)引数の内容
8-3節(313ページ) 以下にブロックの詳細を示します。拡張導入符は・・・ 以下にブロックの詳細を示します。拡張導入符は・・・
8-3節(325ページ)
$counts{'1'} = 'foo';
    $counts{'3'} = 'bar';
    $counts{'2'} = 'zot';
$counts{'1'} = 'foo';
$counts{'3'} = 'bar';
$counts{'2'} = 'zot';

戻る