〜「すぐわかる Perl」第1刷正誤表〜 本正誤表は、第1刷に2000年12月6日までで発見されたバグを修正するものです。 メモ: 2001年11月11日に新しく追加された修正には「▼」をつけてあります。 メモ: 2000年12月6日に新しく追加された修正には「▲」をつけてあります。 メモ: 2009年1月5日に新しく追加された修正には「■」をつけてあります。 (以下は全正誤表に共通の文章です) エーごらんいただければわかりますが、間違い、多いです。 まあ書を読みて悉くそれを信ずれば書なきが如しと申しますが(これこれ) それにしても読者の方にあらためてお詫び申し上げます。大変ご面倒をお掛けしますが、訂正をお願いいたします。 正誤表の文責は著者の深沢千尋にあります。 えっと、必ずしも正誤表通りに修正されたわけではありませんが(長い追加はレイアウト上の理由で短縮したなど) 以下では著者の意図通りにしています。 なお、必ずしも間違いではありませんが、読みやすくするために修正したものもあります。 また、脱稿後に変化があった技術情報も追加しています。 間違いのほとんどは、文字通りご精読、ご愛読くださった読者のみなさんによって発見されたものです。 いずれの方も、丁寧に読んでくださった上に、やさしい言葉でご指摘くださり、激励の言葉までいただき、 電子メール画面が涙でにじむこともしばしばありました。何人かの方とは電子メールのやりとりが始まって、 奥付に電子メール アドレスを載せておいてよかったです。本当にみなさんありがとうございました。 今後もよろしくお願いいたします(っておい)。 ご質問、ご意見は Chihiro.Fukazawa@bowneglobal.co.jp までどうぞ。 凡例 ●ページ数、出現個所 ★編集者様へのコメント ●Contents ×1.4 Perl命令をファイルに、、 ○1.4 Perlの命令をファイルに、、 ●p10 ×Machintosh ○Macintosh ●p12 メモ ×「\which -a」「\type -a」などの、、 ○「\which -a perl」「\type -a perl」などの、、 ●p18 ★「実行権限が足りないので実行を拒否します、という意味です。」の後に次のメモを書きます。 メモ Perlのスクリプトは実行権限だけでなく、読み込み権限(読まれる権限)も必要です。スクリプトを処理する プログラムが読み込んで実行するからです。UNIXでファイルを作った時、通常の設定では全員に読み込み権限が ありますから特に設定は必要ありませんが、chmod a+xしてもPermission denied. と怒られたらさらに chmod a+r(読み込み権の追加)を行なってください。パーミッションはファイルの作成者(あなた)、 あなたと同じグループの他の人、あなたと違うグループの人の3種類について別々に設定されるので 注意してください。 ●p24〜(偶数ページ ヘッダー) ×最初の一歩〜プログラムの作成と実行〜 ○電卓プログラムを作ろう〜式と計算、変数について〜 ●p24 ×3. emacs、vi など、、 ○3. Emacs、vi など、、 ●p37 下の方 ×6.03×10^23 ○6.0221×10^23 ●p37 下の方 ×6.03e+023 ○6.0221e+023 ●p42 ▼2001/11/11 新着バグ ×みんな大目に払って ○みんな多めに払って ●p43 ×$ave = ($suzuki + $satou + $johnnny); / $atama; #... ○$ave = ($suzuki + $satou + $johnnny) / $atama; #... ★セミコロンが余計 ●p45 メモの囲みの中に「メモ:」と書いています。取ってください。 ●p48 ■2008/1/5 新着バグ × 3.141592650 および 3.1415926050(2回) ○ 3.14159265 ●p50 ▼2001/11/11 新着バグ ×攻撃する日時はどこですか ○攻撃する日時はいつですか ●p61 ★掛け網部分 × 条件文2が偽のときに実行される命令1; 条件文2が偽のときに実行される命令2; ○ 条件文2が真のときに実行される命令1; 条件文2が真のときに実行される命令2; ●p62 の末尾に以下のメモを入れてください。 メモ ここで述べたうるう年のルールは、過去にはあてはまらない場合がありますのでご注意ください。 現在のようなうるう年の決め方は 1582 年のグレゴリオ暦の教書で制定され、それ以前は単純に 4 で割り切れる年をすべてうるう年にしていました(ユリウス暦)。しかし、ユリウス暦から グレゴリオ暦への転換時期は国によってさまざまで、イギリスは 1752 年に、日本は 1873 年に 転換しました。よって、過去のある年度がうるう年だったかどうかはその年度と国によって さまざまに異なります。 ちなみに FreeBSD の cal コマンドはアメリカのかつての宗主国イギリスに合わせており、 1700 年をうるう年にしています。 ●p70 ▲2001/3/26 新着バグ ★掛け網部分の2個目 × aaa aaaa aaab aaaaa aaaab ○ aaa aaaa aaaaa aaaab aaab ●p74 ×or のことは論理積というんでしたね。and は掛け算として機能します。ゼロ以外の,,, ○and のことは論理積というんでしたね。and は掛け算として機能します。ゼロ以外の,,, ●p74 ■複合条件の真偽 ×真をゼロ、偽をゼロ以外、 ○真をゼロ以外、偽をゼロ、 ●p75 ここで、A が真、B が偽、C が真とすると、 ×・まず掛け算だから and を先に考えて、「ゼロ」×「ゼロ以外」なので ○・まず掛け算だから and を先に考えて、「ゼロ以外」×「ゼロ」なので ... A が偽、B が真、C が偽とすると、 ×・まず and を先に考えて「ゼロ以外」×「ゼロ」なので ○・まず and を先に考えて「ゼロ」×「ゼロ以外」なので ... A が偽、B が真、C が偽とすると ×・まずorを先に考えて「ゼロ以外」+「ゼロ以外」なので ○・まずorを先に考えて「ゼロ以外」+「ゼロ」なので ×・そのゼロ以外と条件Aの論理積は「ゼロ以外」×「ゼロ」なのでゼロ(偽) ○・そのゼロ以外と条件Aの論理積は「ゼロ」×「ゼロ以外」なのでゼロ(偽) メモ ×このように「真」をゼロ、「偽」をゼロ以外、 ○このように「真」をゼロ以外、「偽」をゼロ、 ●p77 図版 ★菱形 $n > 1 の Y と N が逆です。 下に降りる脚を Y に、右に延びる脚を N にしてください。 ●p76〜89 ★プログラム名 power および変数 $power を、それぞれ factorial および $factorial としてください。 階乗という意味で power という言葉を使っていますが、これは正しくは factorial です。 power はべき乗という意味です。 ●p78 ★「制御」という新出用語が「」つき、細字の青字になっています。 他の語に合わせ、「」なし、太字の青字にしてください。 ●p82 ×同様に、$a が 0 になるまでループ、というつもりで、 ○同様に、$a が 0 である間ループ、というつもりで、 ●p85 下から5行目 ×$div が $n を越えても、 ○$div が $n/2 を越えても、 ●p87 ×while だけでも問題は解けるのですが、、 ○if と while だけでも問題は解けるのですが、、 ●p91 ×カウントップあるいはカウントダウン ○カウントアップあるいはカウントダウン ●p93 ×ウォイジャー ○ヴォイジャー ●p99 ×$suzuki、$satou、$jonny ○$suzuki、$satou、$johnny ●p103 ×@tall の中身は (145,155.2,undef,undef,200)に、、 ○@tall の中身は (145,155.2,undef,undef,undef,200)に、、 ●p104 × $a = $tmp; $b = $a; $a = $tmp ○ $tmp = $a; $a = $b; $b = $tmp ●p106 末尾 ×@top3 = (185.3, 180.5, 173.5, 170.2. 169.9)[0..2]; ○@top3 = (185.3, 180.5, 173.5, 170.2, 169.9)[0..2]; ★170.2 のあとの . は , の間違い ●p107 ×@top3 = (185.3, 180.5, 173.5, 170.2. 169.9)[@top3indexes]; ○@top3 = (185.3, 180.5, 173.5, 170.2, 169.9)[@top3indexes]; ★170.2 のあとの . は , の間違い ●p107 ▼2001/11/11 新着バグ ×10 個の数字が入ります。 ○11 個の数字が入ります。 ●p107 ×...178.2, 145.9,155.5... ○...178.2, 145.9, 155.5... ●p118 ■2008/1/5 新着バグ ★掛け網部分 ×% test love kiss および % test love kiss hug ○% argtest love kiss および % test love kiss hug ●p120〜122 ▼2001/11/11 新着バグ ×helon ○heron ●p120 図版 ×s = a + b + c / 2 すると ○s = a + b + c / 2 とすると ●p136 ▼2001/11/11 新着バグ ×出力を終えるには EOF ○入力を終えるには EOF ●p138 ×sort の入力を uniq に渡します。 ○sort の出力を uniq に渡します。 ●p138 ×これできれいに行の内容がひとつずつになります。 ○これできれいに内容が同じ行がひとつずつになります。 ●p150 ▼2001/11/11 新着バグ ×びっしり埋まった数 ○びっしり埋まった文字列 ●p152 ×要は、スペース以外で終止すればいいのです。 ○要は、スペース以外で終始すればいいのです。 ●p155 下のほう ×、、「/\/\/\/\/\//」と書くかわりに、「m/////|」と書けるので、、 ○、、「/\/\/\/\/\//」と書くかわりに、「m|/////|」と書けるので、、 ●p161 下のほう ×これは、置換演算子 s の最初にマッチした時点で処理を終わってしまうという特性のためです。 ○これは、置換演算子 s の「最初にマッチした時点で処理を終わってしまう」という特性のためです。 ●p177 ▼2001/11/11 新着バグ ×translitarate ○transliterate ●p182 ▼2001/11/11 新着バグ ×2番目の非数字に囲まれた2桁以下の数字を月名と判断する ○2番目の非数字に囲まれた2桁以下の数字を日付と判断する ●p184 ★箇条書き(・)の4番目と5番目を次のように変えてください。 ・Jan、Feb…が見つかった場合は、最初の非数字に囲まれた 2 桁以下の数字を日と判断する。 見つからなかった場合は、最初の非数字に囲まれた 2 桁以下の数字を月と判断し、2 番目の 非数字に囲まれた 2 桁以下の数字を日と判断する ・上記の論理で年/月/日が定まらない場合は、一番後ろにソートするために、年には 9999 を、 月/日にはそれぞれ 99 をセットする ●p184 ×それが4月12日なら、 ○それが1984年4月12日なら、 ●p184-185 × if ($x =~ /Jan/) { $mon = "01"; } elsif ($x =~ /Feb/) { $mon = "02"; ... ○ if ($x =~ /Jan/i) { $mon = "01"; } elsif ($x =~ /Feb/i) { $mon = "02"; ... ★ぜんぶの英語の月名のうしろのスラッシュの後に i をつけます。 ●p189 × sub yymmdd { ... } ○ sub yymmdd { ...(p184-185 で作ったサブルーチン yymmdd の内容が入ります)... } ●p194 ▼2001/11/11 新着バグ ×% rep フィルター名 変換前のファイルの拡張子 変換前のファイルの拡張子 ○% rep フィルター名 変換前のファイルの拡張子 変換後のファイルの拡張子 ●p197(メモの表組み) ▼2001/11/11 新着バグ × . 1文字の文字列 ○ ? 任意の1文字 ●p199 下のほう × のようにバッククォートで UNIX のコマンドを囲むと、UNIX のコマンドが実行されます。 ○ のようにバッククォートで UNIX のコマンドを囲むと、UNIX のコマンドが実行され、 その結果標準出力に出力される文字列が値として返ります。$a = `コマンド` のように スカラー コンテキストで評価するとコマンドの結果が改行記号も含めてずらずら入り、 @a = `コマンド` のようにリスト コンテキストで評価すると @a にコマンドの結果が 1行1要素の配列に(1行目が $a[0] に、2行目が $a[1] に)入ります。 ●p206 プログラム リスト ×($argn == 2) or bye... ○($argn == 2) or &bye... ×(@files + 0) or bye... ○(@files + 0) or &bye... ★bye の前に & を付けてください。(なくても動きますが、本書の方針としてつけます) ●p206 × print OUT; } close IN; close OUT; } sub bye { ○ print OUT; } } close IN; close OUT; sub bye { ●p209 ×上のプログラムを見て、あれ変だな、 ○206 ページのプログラムを見て、あれ変だな、 ●p210 ×From: Hiroko Shimabukuro <hiroko@speed.com> ○From: Hiroko Shimabukuro <Hiroko.Shimabukuro@speed.org> ●p215 末尾 × sub dirproc { my($dep); my(@files, files); ... ○ sub dirproc { my($dep) = @_; my(@files, $file); ... ●p223 ×・selectで出力のファイルハンドルを切り替える ○・selectでデフォルトの出力ファイルハンドルを切り替える ●p224 ×命を掛けてる ○命を懸けてる ●p231 ×"hiroko","11-1111-1111","eriko","22-2222-2222","eriko"... ○"hiroko","11-1111-1111","eriko","22-2222-2222","takako"... ●p236 中ほど × print <<EOD; while(<STDIN>) { ... ○ print <<EOD; ); while(<STDIN>) { ... ●p236 ★いちばん下の図版の、いちばん下の行「EOD」を 濃い網掛けからはずしてください。 ●p240 ▲2001/05/06 新着バグ ★「■dbmデータベースとハッシュを結び付ける」の前に、次のメモを挿入してください。 メモ ここでは dbmopen('kudamono_db') の実行によって kudamono_db.pag、kudamono_db.dir という2個の物理ファイルができて、 これをアクセスしますが、Perl のインストール環境によっては、 kudamono_db.db という拡張子が「db」のファイルがただひとつできる場合もあります。 ●p242 ×kudamono ではプログラムの最初に定義したハッシュを呼んでいましたが、今度は dbm と結び付けられたハッシュを呼んでいる、、 ○kudamono ではプログラムの最初に定義したハッシュを読んでいましたが、今度は dbm と結び付けられたハッシュを読んでいる、、 ●p245 ×値はvalue関数で一覧が ○値はvalues関数で一覧が ●p245 ×valueで値のリストを作って、 ○valuesで値のリストを作って、 ●p247 ×valueで得られたリストをソートしたら ○valuesで得られたリストをソートしたら ●p250 真ん中下 ×1.「dbdata 果物名 単価」 ○1.「dbedit 果物名 単価」 ●p251〜253 ▼2001/11/11 新着バグ ×do you want to sell it with the price ○do you want to sell it at the price ●p255 ×・使いおわったら dbmclose で削除する ○・使いおわったら dbmclose で閉じる ●p256 ×自分の頭で思考する習慣を奪って、、 ○自分の頭で思考する習慣をなくして、、 ●p264 ▲2000/12/6 新着バグ ★末尾から2行目「CGI プログラムは普通 nobody という誰でもないユーザーが実行するようになっています。」の後に次の メモを入れてください。 メモ Perlスクリプトの場合は、実行権でなく読み込み権も全員に必要ですので注意してください(755、rwxr-xr-x の状態)。これは、 Perlがスクリプトを読み込んで実行するからです。 なお、Web サーバーの設定によっては、user のみに読み込み/実行権がある状態(700、rwx------)、user と other のみに 読み込み/実行権がある状態(705、rwx---r-x)でも動作する場合があります。サーバーの設定を調べて、可能な限り少ない権限を 与えるようにしてください。パーミッションについてくわしくは、CGI の専門書を参照してください。 ●p267 ×というように、キー名とデータ名の対が、、 ○というように、変数名とデータの対が、、 ●p268 ★下の行 $value =~ s/%([0-9a-fA-F][0-9a-fA-F]/pack("C", hex($1))/eg; ★の下に、下の2行を挿入する。 $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; ●p270 ★p268 と同 ●p272 ▲2000/12/6 新着バグ ★下の行 以上で、掲示板プログラムを終わります。 ★の前に、以下の段落とメモを挿入します。 なお、以前 CGI プログラムはユーザー nobody によって実行されるので、全員に実行のパーミッションを 与えてくださいと書きましたが、同様に、ユーザーが書き込みを行なうファイル/ディレクトリには、 全員に書き込みのパーミッションを与えてください。ということで、この例題プログラムを運用する場合は、 chatform.html を chmod a+w する必要があります。 メモ Web サーバーの設定によっては、全員に書き込み権を与えないで、user のみに書き込み権がある場合や、user と other のみに 書き込み権がある場合でも、CGI によって書き込みが可能な場合があります。サーバーの設定を調べて、可能な限り少ない権限を 与えるようにしてください。パーミッションについてくわしくは、CGI の専門書を参照してください。 ●p278 2個めのメモ ×シフト JIS コードの、正確な名称は「MS 漢字コード」です。 ○シフト JIS コードのことを「MS 漢字コード」と呼ぶこともあります。 ●p286 ▲2000/12/6 新着バグ ★「jcode.plを置いた正しいフルパスを指定してください。」のあとに次のメモを入れてください。 メモ くわしく述べませんが、require は Perl の使用者によって共有されるライブラリが入っているパスを検索してくれます。単に require 'jcode.pl'; と書いても、共有ライブラリのディレクトリに jcode.pl が入っていれば、読み込まれる可能性があります。共有ライブラリの ディレクトリの一覧は、@INC という特別な配列変数に入っています。 なお、require されるファイル(この場合は jcode.pl)は、Perl プログラムを実行する人に対して<太字>読み込み太字>の パーミッションが必要です。これは require 命令によって読み込まれるからです。 ●p286 ▲2000/12/6 新着バグ ★次の段落をまるごと入れ替えてください。 ×まず注意して欲しいのは、jcode.plをCGIプログラムが置けるディレクトリ(たとえば /home/Hiroko/public_html/cgi-bin)に、 CGI プログラムとして認識される拡張子(たとえば「.cgi」で置く、ということです。これは CGI プログラム本体と同じです。 ○まず、jcode.pl が Perl の共有ライブラリにない場合(「require 'jcode.pl';」で正しく読み込まれない場合)は、 適当なディレクトリに置く必要があります。ここでは「/home/Hiroko/public_html/cgi-bin」に置くことにします。 ●p287 ▲2000/12/6 新着バグ ★後半のコード、網掛けの部分 ×require 'jcode.cgi'; ○require '/home/Hiroko/public_html/cgi-bin/jcode.pl'; ●p287 ▲2000/12/6 新着バグ ★末尾 ×まず、jcode.cgi(jcode.pl の拡張子を変えたもの)を require します。上の例では、hello.cgi と同じディレクトリに 保存しておきます。このとき、jcode.cgi も chmod a+x しておくのを忘れないでください。 ○まず、jcode.pl を require します。上の例では、hello.cgi と同じディレクトリに保存しておきます。このとき、 jcode.pl も chmod a+r しておくのを忘れないでください。 ●p288 ▲2000/12/6 新着バグ ★上の修正の直下に下のメモを入れてください。 メモ Web サーバーの環境設定によっては、jcode.pl のパーミッションは全員に読み込み権がある状態(644、r--r--r--)でなく、 user のみにある状態(600、rw-----)や user と other のみにある状態(604、rw----r--)でも動作する場合があります。 ●p291 ★付録Aの末尾に次のメモを入れてください。 メモ: Unicode の実装ですが、本章を脱稿後に大きな変化がありました。 ・jcode.pl の後継である Jcode.pm という DAN kogai さんによる モジュール(本書では使い方を述べていません)で Unicode をサポートしています。 Unicode にはいくつか種類があるのですが、UCS2 と UTF-8 をサポートしています。 ・2000 年 3 月に正式リリースされた Perl 5.6(Perl 5.005 の次のバージョンです。 バージョン番号の付け方が変わりました)でも UTF-8 をサポートしています。 が、どちらも 2000 年 5 月現在実験的機能で、完璧ではない可能性がありますので、 いろいろ文献に当たって自己責任でお使いになることをおすすめします。 ●p299 ×Emacs の shell の場合は [Ctrl]-[c][Ctrl-[c] ○Emacs の shell の場合は [Ctrl]-[c][Ctrl]-[c] ●p307 下の方 ×ここではひとつ下のディレクトリ、、 ○ここではひとつ上のディレクトリ、、 ●p308 ×つまり /home/Hiroko/perl は、、 ○つまり /home/hiroko/perl は、、 ●p311 ×setenv MANPATH "/home/Hiroko/man:... ○setenv MANPATH "/home/hiroko/man:... ●p313 ★末尾に以下のメモを追加 メモ: FreeBSD の Packages には、日本語化された man が入っています。 ●p316 ×したがって、ダブルクリックで実行して、引数も使えるようにするには、、 ○したがって、ダブルクリックで実行して、ファイルなども使えるようにするには、、 ●p321 ×system に which などの UNIX 命令を渡している場合は確実に動きません。 ○system に which などの UNIX 命令を渡している場合は、Cygwin などの UNIX 風環境を使わない限り確実に動きません。 ●p321 ★宮下尚さんのページがリンク ブレークしています。わたしはユーザーが公開しているサイトしか 発見できませんでした。 ●p323 ×(HirokoShimabukuro@speed.org など) ○(Hiroko.Shimabukuro@speed.org など) ●p330 ×また、特に紹介しませんでしたが、ファイル名をプログラム内にハードコーディング、、 ○また、ファイル名をプログラム内にハードコーディング、、 ●p332 ×これもオライリー。ラクダに似ていますが、、 ○これもオライリー。表紙の動物はラクダに似ていますが、、 ●p333 GNU Emacs の紹介 ×今度はウシの本です。 ○この本の表紙を飾っている動物がヌー(gnu)。アメリカに生息するウシ科の動物です。 ●索引 G、H、I、J、K ★以下の2項目を次のように直してください。 × i.............................155 iスイッチ.....................163 ○ iスイッチ(マッチ演算子).....155 iスイッチ(置換演算子).......163 ●索引 T、U、V、W、X、Z ×value関数 ○values関数 ●索引 あ行 ×宇宙演算子 ○宇宙船演算子 ●あとがき ▼2001/11/11 新着バグ ×who allowed my "moonwritting" kindly. ○who allowed my "moonwriting" kindly. ●奥付 ×Chihiro.Fukazawa@bowneglonal.co.jp ○Chihiro.Fukazawa@bowneglobal.co.jp (以上)