Errata


Print Print Icon

Submit your own errata for this product.


The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Corrected".

The following errata were submitted by our customers and approved as valid errors by the author or editor.


Color Key: Serious Technical Mistake Minor Technical Mistake Language or formatting error Typo Question



Version Location Description Submitted By Corrected
Printed Page viii
There's a typo in the table of contents where an additional space

appears before 6.4 " Commenting with Regular Expressions".

Anonymous 
Printed Page xxx
first paragraph under "Documentation Conventions"

"printer pager" should be "printer paper".

Anonymous 
Printed Page xxviii
Knuth's "The Art of Computer Programming" now says 3rd Edition, 1998.

Anonymous  Dec 2000
Printed Page 2
In the 3rd paragraph, changed


0, 0.00, and 0.0000000 are all

to

0., 0.00, and 0.0000000 are all

Anonymous  May 1999
Printed Page 3

In the first complete sentence, changed "as with ' here" to read :

"as with / here".

Anonymous  May 1999
Printed Page 5

The 1st paragraph used to read:

You can use the =~ operator in conjunction with the s///,
m//, or tr//// operators to make them affect only that
portion of the string.

Changed to:

You can use the =~ operator and the s///, m//, or tr////
operators in conjuncton with substr to make them affect only
that portion of the string.


Anonymous  May 1999
Printed Page 8
In the 1st paragraph, changed the mention of "Recipe 8.13"

to "Recipes 13.11 or 14.11".

Anonymous  May 1999
Printed Page 9
Changed "perlop" to "perldata" under See Also.

Anonymous  May 1999
Printed Page 15
Added the missing quotation mark to "Switches" in the

See Also section.

Anonymous  May 1999
Printed Page 17
The code comment "single quotes!" now reads "like single quotes!".

Anonymous  May 1999
Printed Page 18
code example, middle of page

$$1 has been changed to ${$1} in two instances. The code now reads:

# expand variables in $text, but put an error message in
# if the variable isn't defined
$text =~ s{
$ # find a literal dollar sign
(w+) # find a "word" and store it in $1
}{
no strict 'refs'; # for $$1 below
if (defined ${$1}) {
${$1}; # expand global variables only
} else {
"[NO VARIABLE: $$1]"; # error msg
}
}egx;

Anonymous  Aug 2001
Printed Page 20
The = sign now lines up with the others in the code example at

the top of the page.

Anonymous  May 1999
Printed Page 20
Changed "You can also use them to do" to "You can also use

their functional forms to do"

Anonymous  May 1999
Printed Page 30
The user is correct that the formatting is all askew, and also

correct in their suggested fix, to wit:

sub trim {
my @out = @_;
for (@out) {
s/^s+//;
s/s+$//;
}
return wantarray ? @out : $out[0];
}

However, I think they somewhat miss the mark on what to do when a list
is passed in while under scalar context. This is an odd situation,
such as you see in

$string = reverse(@list);

So perhaps the same approach should be taken here, amending the
return to

return wantarray ? @out : "@out";

Anonymous 
Printed Page 30
Halfway down, in sub trim: the first 4 lines following

sub trim { were indented one tab-stop too far. The code now reads:

sub trim {
my @out = @_;
for (@out) {
s/^s+//;
s/s+$//;
}

Anonymous  May 1999
Printed Page 31
Change the parse_csv routine to the following

# See MRE2, p214
sub parse_csv {
my $text = shift; # record containing comma-separated values
my @fields = ();

while ($text =~ m{
# Either some non-quote/non-comma text:
( [^"',] + )

# ...or...
|

# ...a double-quoted field: (with "" allowed inside)

" # field's opening quote; don't save this
( now a field is either
(?: [^"] # non-quotes or
|
"" # adjacent quote pairs
) * # any number
)
" # field's closing quote; unsaved

}gx)
{
if (defined $1) {
$field = $1;
} else {
($field = $2) =~ s/""/"/g;
}
push @fields, $field;
}
return @fields;
}

Anonymous 
Printed Page 31
Under See Also, changed "trim leading whitespace" to "trim

leading and trailing whitespace", and deleted "and use it when
we separate list elements in Recipe 4.1"

Anonymous  May 1999
Printed Page 31

The last code example used to read:

return quoteword(",", 0, $_[0]);

It now reads

return quotewords(",", 0, $_[0]);

Anonymous  Sep 1999
Printed Page 34
The word "lorrie" was misspelled in the table. Now reads "lorry".

Anonymous  May 1999
Printed Page 34
In the paragraph above the code example, changed


A -t to test for an interactive run check tells whether

to

A -t check to test for an interactive run tells whether

Anonymous  May 1999
Printed Page 37
The prompt at the bottom-most command is now a "%" like

the rest of them, not a "$".

Anonymous  May 1999
Printed Page 37
1st paragraph

Reference to Recipe 16.14 (installing an output filter) was changed to Recipe
16.5.

Anonymous  Dec 2000
Printed Page 45
In the 1st paragraph, changed "Perl's supports the function"

to "Perl supports the function"

Anonymous  May 1999
Printed Page 50
In the 1st paragraph, changed "use the $x..$y construct" to

"use the $X .. $Y construct"

Anonymous  May 1999
Printed Page 53
Added a semicolon before "Chapter 3" in the See Also section.

Anonymous  May 1999
Printed Page 53
Inserted a thinspace after the "y" at the end of "Cryptography"

and its following semicolon.

Anonymous  May 1999
Printed Page 55
In the first code example,

changed
} while ( $w >= 1 );
to:
while ($w >= 1 || $w == 0)

Anonymous  Jan 2000
Printed Page 64
Changed "to convert from octal and uses hex" to "to convert from

octal and hexadecimal", and changed the font on hexadecimal.

Anonymous  May 1999
Printed Page 64
In See Also: removed ";sysopen in covered in Recipe 7.1"

Anonymous  May 1999
Printed Page 65
Under Solution, changed "ternary hook" to "ternary conditional".


Anonymous  May 1999
Printed Page 65

The middle line of the last code example used to read:


printf "%d hour%s %s enough.
", $time,
$time==1 ? "" : "s";
$time==1 ? "is" : "are";

It now reads::

printf "%d hour%s %s enough.
", $time,
$time==1 ? "" : "s",
$time==1 ? "is" : "are";

Anonymous  May 1999
Printed Page 67
Changed "huge primes" to "huge integers".

Anonymous  May 1999
Printed Page 67
Used to read:

factors 8 9 96 21

Changed to read:

bigfact 8 9 96 2178

Anonymous  May 1999
Printed Page 68
Also changed "factors" to "bigfact" for the other two examples.

Anonymous  May 1999
Printed Page 68
Changed "bignum" in the program text to "bigfact".

Anonymous  May 1999
Printed Page 68
Removed the "$root, " from the declaration

my($n, $root, %factors, $factor);

It now reads:

my($n, %factors, $factor);

Anonymous  May 1999
Printed Page 71
table

The variable "$month" is actually "$mon."

Anonymous 
Printed Page 71
The URL in the bottom of the footnote is out of date. Changed to


http://sciastro.astronomy.net/sci.astro.3.FAQ

Anonymous  May 1999
Printed Page 71
table listing the time fuction variables:

"1-366" now reads "0-365."

Anonymous  Dec 2000
Printed Page 73
first paragraph

"YYYY-MM-DD," now reads "YYYY MM DD",

Anonymous  Dec 2000
Printed Page 75
Changed $TIME to $time

Anonymous  May 1999
Printed Page 77
Changed "Date::DateCalc" to "Date::Calc" throughout page (4 times).

Anonymous  May 1999
Printed Page 78

The seconds were wrong in the output. They now read:


There were 265333775 seconds between Nat and Bree

Anonymous  May 1999
Printed Page 79
Changed "number of days difference" to "number of days".

Anonymous  May 1999
Printed Page 79

The weeks and days were wrong in the output. They now read:


(438 weeks, 4 days, 23:49:35)

Anonymous  May 1999
Printed Page 79
Changed both occurrences of "Bree and Nat" to "Nat and Bree".

Anonymous  May 1999
Printed Page 79
Changed "easily calculated from the day of the year"

to "easily calculated from the day of the year (but
see discussion below, as standards differ)"

Anonymous  May 1999
Printed Page 80
Changed the code in the center of this page as follows

use Date::Calc qw(Day_of_Week Week_Number Day_of_Week_to_Text)

$year = 1981;
$month = 6; # (June)
$day = 16;

$wday = Day_of_Week($year, $month, $day);
print "$month/$day/$year was a ", Day_of_Week_to_Text($wday), "
";
## see comment above

$wnum = Week_Number($year, $month, $day);
print "in week number $wnum.
";
6/16/1981 was a Tuesday
in week number 25.

Anonymous  May 1999
Printed Page 80
2nd program block example, first line, missing semicolon

terminating semicolon missing in example; as shown, recipe will abort.

was:

use Date:Calc qw(Day_of_Week Week_Number Day_of_Week_to_Text)
^
now reads:

use Date:Calc qw(Day_of_Week Week_Number Day_of_Week_to_Text);

Anonymous  Dec 2000
Printed Page 81
In problem 3.7, added a closing parenthesis to the third line

of the first solution.

Anonymous  Jan 2000
Printed Page 81
1st code block

The timelocal function expects months to be in a 0 based format (i.e. 0 =
Jan). In the example given, the date "1998-06-03" is parsed and sent as is to
timelocal(). The month value ("03") should be decremented by 1 before being
passed to timelocal().

now reads:

$epoch_seconds = timelocal(0, 0, 0, $dd, $mm-1, $yyyy-1900);

Anonymous  Dec 2000
Printed Page 84
Changed "seconds between $t1 and $t2" into

"seconds between $t0 and $t1" so it matches the code.

Anonymous  May 1999
Printed Page 84

code now reads:


first chunk:

use Time::HiRes;
$t0 = Time::HiRes::time;
## do your operation here
$t1 = Time::HiRes::time;
$elapsed = $t1 - $t0;
# $elapsed is a floating point value, representing number
# of seconds between $t1 and $t2

second chunk:

use Time::HiRes;
print "Press Return when ready: ";
$before = Time::HiRes::time();
$line = <>;
$elapsed = Time::HiRes::time() - $before;
print "You took $elapsed seconds.
";
Press return when ready:
You took 0.228149 seconds.

Anonymous  Dec 2000
Printed Page 85
In line 2, reading


syscall(&SYS_gettimeofday, $start, 0)) != -1

Deleted second right parantheses.

Anonymous  May 1999
Printed Page 86
Changed "The Time::HiRes provides to "The Time::HiRes module provides"

Anonymous  May 1999
Printed Page 94
The header now reads "Discussion" instead of "Description"

Anonymous  May 1999
Printed Page 94
Changed


print "I have @array marbles
.";

into

print "I have @array marbles.
";

Anonymous  May 1999
Printed Page 95
Changed "conditional operator discussed" to "conditional

operator is discussed"

Anonymous  May 1999
Printed Page 97
In the 5th paragraph, changed "entry for $#array" to

"discussion of the $#array notation".

Anonymous  May 1999
Printed Page 99
Changed


print "@array";

to

print "@array
";

Anonymous  May 1999
Printed Page 99
Changed


foreach $item (@a, @b) {
$item *= 7;
print "$item ";
}

to

foreach $item (@a, @b) {
$item *= 7;
}
print "@a @b
";

Anonymous  May 1999
Printed Page 102
Changed "@unique" to "@uniq" in the last line on this page.

Anonymous  May 1999
Printed Page 107
In the 3rd paragraph of the Discussion, changed "Unlike the

initial solution, the elements..." to "The elements..."

Anonymous  May 1999
Printed Page 111
In the 2nd paragraph, deleted the "be" from "isn't be an array"



Anonymous  May 1999
Printed Page 114

The code used to read :


@MATCHING = ();
foreach (@LIST) {
push (@MATCHING, $_) if TEST ($_)

It now reads:

@matching = ();
foreach (@list) {
push (@matching, $_) if TEST ($_)

Anonymous  May 1999
Printed Page 115

The example under Solution used to read:

@Sorted = sort { $a <=> $b } Unsorted;

It now reads:

@sorted = sort { $a <=> $b } @unsorted;

Anonymous  May 1999
Printed Page 115
In the 1st paragraph under Discussion, changed "comparison

routine with..." to "comparison subroutine with..."

Anonymous  May 1999
Printed Page 120
Changed "remove the temporary array" to

"remove the temporary arrays"

Anonymous  May 1999
Printed Page 124
In the 3rd paragraph, 2nd line, changed "longest line seen"

to "length of longest line seen"

Anonymous  May 1999
Printed Page 124
In the 3rd paragraph, 3rd line, changed "by the longest input

record seen" to "by the length of the longest input record seen"

Anonymous  May 1999
Printed Page 125
Near the bottom of the page, indentation of `sub fact...'

is now flush left.

Anonymous  Mar 2000
Printed Page 126
4th paragraph

now reads:

You call n2perm with two arguments: the permutation number
to generate (from 0 through factorial(N)-1, where N is the
size of your array) and the subscript of the array's last
element.

Anonymous  Dec 2000
Printed Page 127
Changed "permutation of S objects" to "permutation of $len objects"

Anonymous  May 1999
Printed Page 127
Changed Camel:3 to "Chapter 3 of Programming Perl", and

Camel:2 to "Chapter 2 of Programming Perl".

Anonymous  May 1999
Printed Page 130
Changed


the discussions of closures in the "Private Variales via my()"
section of perlsub(1) and perlref(1)

to

the discussions of closures in perlsub(1) and perlref(1)

Anonymous  May 1999
Printed Page 135
Changed "Use each with while loop:" to "Use each with a while loop:"

Anonymous  May 1999
Printed Page 144
Changed


foreach $food (sort { $food_color{$a} cmp $food_color{$b} } )
keys %food_color) {
print "$food is $food_color{$food}.
";
}

to
foreach $food (sort { $food_color{$a} cmp $food_color{$b} }
keys %food_color)
{
print "$food is $food_color{$food}.
";
}

Anonymous  May 1999
Printed Page 145
In the 1st paragraph under Discussion, changed "we assign it

to %MERGED," to "we assign it to %merged,"

Anonymous  May 1999
Printed Page 145
In the last line on the page, changed "%ingested_colors"

to "%ingested_color"

Anonymous  May 1999
Printed Page 146
The first $substance_color in this paragraph now lines up

with the second.

Anonymous  May 1999
Printed Page 148
Deleted "The explanation of hash slices in perldata(1) and"

under See Also, because this recipe did not discuss them.

Anonymous  May 1999
Printed Page 148
In the example under Solution, changed "as the keys to %HASH"

to "as the keys to %hash"

Anonymous  May 1999
Printed Page 151
Changed


The first foreach adds one to $count{$element} for each
occurrence of $element.

to

The foreach adds one to $count{$element} for every
occurrence of $element.

Anonymous  May 1999
Printed Page 151
In the paragraph under Problem, italicized "of" in the

phrase "the mother of relationship"

Anonymous  May 1999
Printed Page 152
Changed


next unless /^s*#s+includes+<([^>]+)>/;

to

next unless /^s*#s*includes*<([^>]+)>/;

Anonymous  May 1999
Printed Page 152
The description of the code sample about #includes

was wrong. Tracing the second part of the example, it
looked like @include_free would contain a list of files
that contain include statements, but are not themselves
included in any files. So:

This shows which files don't include any others:

Now reads:

This shows which files with include statements are not
included in other files.

Anonymous  Sep 1999
Printed Page 153
Changed "% du 9781565922433" to "% du pcb"

Anonymous  May 1999
Printed Page 154
Changed


contains "yes" and "no", which do not have

to

contains "yes" and "not", which do not have

Anonymous  May 1999
Printed Page 155
Changed "contains a reference to an anonymous array containing"

to "contains"

Anonymous  May 1999
Printed Page 155
Changed


contains "pcb/rev/yes" and "pcb/rev/no".

to

contains "pcb/rev/yes" and "pcb/rev/not".


Anonymous  May 1999
Printed Page 156
Halfway down the page was a line containing nothing but


i}

Deleted the i.

Anonymous  May 1999
Printed Page 161

Perl example at the top now reads:

$ echo longest | perl -ne 'print "$&
" if /(long|longer|longest)+/'
long

And in the Awk example later:

$ echo longest |
awk 'match($0, /(long|longer|longest)+/)
{ print substr($0, RSTART, RLENGTH) } '
longest

Anonymous  Jan 2000
Printed Page 163
the last sentence in 4th paragraph before the code, the variables are reversed and must be switched.

$' and $`
should be
$` and $'
(Also, make very certain those are symmetric ticks, not a vertical prime.)

Anonymous 
Printed Page 165
5th paragraph

In the code before the "See Also" block, the first line now read

($a = $b) =~ s/x/y/g; # copy $b to $a, then change $b

Anonymous  Dec 2000
Printed Page 166
IN PRINT: "Discussion" section, first paragraph, fourth sentence

The negated character class [^Wd_] specifies a byte that must not be an alphanumunder, a digit, or an underscore.

Should be:

The negated character class [^Wd_] specifies a byte that must be neither a non-alphanumunder, a digit, nor an underscore.

Anonymous 
Printed Page 172
3rd para

The correct text now reads:

When you want the last match of arbitrary pattern A, you find A
followed by any number of characters not followed by A.
The general construct is A(?!.*A), which can be broken up
for legibility:

m{
A # find some pattern A
(?! # mustn't be able to find
.* # something
A # and A
)
}x

Anonymous  Dec 2000
Printed Page 178
In the 3rd line of code, changed "different liens" to "different lines"

Anonymous  May 1999
Printed Page 191
At the bottom of the page, changed "Found numeral..." to

"Found number..." 3 times.

Anonymous  May 1999
Printed Page 192
`Even effectively' is now `Even effectively' (2 spaces)

Anonymous  Jan 2000
Printed Page 193
Regular expression on last line of page

/(BEGIN((?:(?!BEGIN).)*)END)/
Should be:
/(BEGIN((?:(?!BEGIN).)*?)END)/

Anonymous 
Printed Page 193
In the 2nd paragraph from the bottom of the page, changed


and then "</b></i>"

to:

and then "</i></b>"

Also changed

corresponding "</b></i>"

to:

corresponding "</i></b>"

Anonymous  May 1999
Printed Page 200

Changed the comment that used to read:


# look for a lap

It now reads:

# look for a lab

Anonymous  May 1999
Printed Page 200
Removed trailing slash from (?=^.*?bell)(?=^.*?lab)/

in the 3rd paragraph.

Anonymous  Jan 2000
Printed Page 205
In the 2nd paragraph from the bottom of the page,

changed "an educate guess" to "an educated guess"

Anonymous  May 1999
Printed Page 214
The words "usage()" and "new()" used to be italicized;

they are now plain text.

Anonymous  May 1999
Printed Page 218
Keyword = Value

Changed:
m/(w+)s*=s*(.*)s*$/ # keyword is $1, value is $2
to:
m/(w+)s*=s*(.*?)s*$/ # keyword is $1, value is $2

Anonymous  Jan 2000
Printed Page 218-219

"IP Addresses" section now reads:

Dotted quads (most IP addresses)
# XXX: fails on legal IPs 127.1 and 2130706433
m{
^ ( d | [01]?dd | 2[0-4]d | 25[0-5] )
. ( d | [01]?dd | 2[0-4]d | 25[0-5] )
. ( d | [01]?dd | 2[0-4]d | 25[0-5] )
. ( d | [01]?dd | 2[0-4]d | 25[0-5] )
$
}x

Anonymous  Jan 2000
Printed Page 226
Changed the assignment from $sink to $fh in the program

code example.

Anonymous  May 1999
Printed Page 226
On the "$filename for reading" line, changed "for reading"

to "for writing".

Anonymous  May 1999
Printed Page 234
1st paragraph

Change
"The second solution gets a temporary file whose name you can give to another process."
to:
"The second solution from the Solution section gets a temporary file whose name you can give to another process."

Anonymous 
Printed Page 235
1st paragraph

The sentence:

Text after __DATA__ in Primes.pm can be read from the Primes::DATA filehandle.

is misleading. The filehandle depends on the package in effect at the __DATA__ token, not on the filename.

Anonymous 
Printed Page 237
In the 2nd paragraph, "See 16.15" now reads "See 16.6"

Anonymous  May 1999
Printed Page 242
Switched places of 2 blocks of code.

Anonymous  Jan 2000
Printed Page 251
All three cases in the code that had "vec($r," now have

"vec($rout," instead.

Anonymous  May 1999
Printed Page 254
In the Discussion section

now reads:
"are numeric values normally found lurking C include files."
^ in

Anonymous  Mar 2000
Printed Page 255
line 7


% cc -o fionread fionread

now reads

% cc -o fionread fionread.c

Anonymous  Dec 2000
Printed Page 259
first paragraph

Variable name $FileCache::maxopen has been changed to:
$FileCache::cacheout_maxopen.

Anonymous  Aug 2001
Printed Page 266
Example 7.21: at the bottom of the page within the END{} block

return rmdir($lockname);

Should be:

rmdir($lockname);

Anonymous 
Printed Page 279
In section 8.2, the first line under "Discussion":

"file size file" now reads "file size".

Anonymous  May 1999
Printed Page 281

Paragraph 3 used to read:

Bear this in mind when you choosing a pattern to match.

It now reads:

Bear this in mind when you choose a pattern to match.

Anonymous  Sep 1999
Printed Page 284
Changed

$data = '/usr/share/games/fortune';
to:
@ARGV = ('/usr/share/games/fortune') unless @ARGV;

Anonymous  Jan 2000
Printed Page 284
last code


$data = '/usr/share/games/fortunes';

now reads

@ARGV = qw( /usr/share/games/fortunes );

Anonymous  Dec 2000
Printed Page 285
In the 1st paragraph, changed "file, But you usu-" to

"file, but you usu-"

Anonymous  May 1999
Printed Page 286
In 8.7

@reordered = shuffle(@lines);

now reads

fisher_yates_shuffle(@lines);

Anonymous  Sep 1999
Printed Page 286
2nd paragraph (first block of code)

The sixth line of the code has been changed. The code now reads:

# assumes the &suffle sub from Chapter 4
while (<INPUT>) {
push(@lines, $_);
}
fisher_yates_suffle(@lines);
foreach (@lines) {
print OUTPUT $_;
}

Anonymous  Aug 2001
Printed Page 287
In the code at the bottom of the page, changed


$tie = tie(@lines, $FILE, O_RDWR, 0666, $DB_RECNO) or die

to

$tie = tie(@lines, "DB_File", $FILE, O_RDWR, 0666, $DB_RECNO) or die

Anonymous  May 1999
Printed Page 292
In the 5th paragraph under Discussion, moved the quote and

backslash down to the next line.

Anonymous  May 1999
Printed Page 295
In code at bottom

Changed /usr/adm to var/log.

Anonymous  Jan 2000
Printed Page 295
line 4 from bottom


... $time, $line, $time);

now reads

... $time, $line, $host);

Anonymous  Dec 2000
Printed Page 296
In code at bottom

changed:
($file, @addrs) = @ARGV or die "usage: $0 addr ...";
to:
($file, @addrs) = @ARGV or die "usage: $0 file addr ...";

Anonymous  Jan 2000
Printed Page 300

The order of tests was reversed. It used to read:

do "$APPDFLT/sysconfig.pl"
or
do "$ENV{HOME}/.myprogrc";

Now reads:

do "$ENV{HOME}/.myprogrc";
or
do "$APPDFLT/sysconfig.pl"

Anonymous  May 1999
Printed Page 302
The heading used to read Description. It now reads: Discussion

Anonymous  May 1999
Printed Page 303
In the 2nd paragraph, changed

If you don't have an unrestrictedversion

to read:

If you don't have an unrestricted version

Anonymous  May 1999
Printed Page 304
line 10 of middle code

The while statement was left-shifted one tabstop.

Anonymous  Dec 2000
Printed Page 305
1st paragraph

now reads

"... offers features not found on other version of tee."

should read "other versions" instead.

Anonymous 
Printed Page 305
In code at bottom

Changed usage tee... to usage $0...
Fixed indent of 3rd }

Anonymous  Jan 2000
Printed Page 307
First line of code

Changed /usr/adm to var/log

Anonymous  Jan 2000
Printed Page 307
line -7:

"sizeofor" now reads "sizeof or".

Anonymous  Dec 2000
Printed Page 307
line -8

"die" now reads "warn."

Anonymous  Dec 2000
Printed Page 312
-2.2

"change directory" now reads "change the directory." (Sounded too much like
chdir as written).

Anonymous  Dec 2000
Printed Page 315
In the 2nd paragraph under Discussion, changed "report which

filenames it couldn't delete, only how many." to read "report
which filenames it couldn't delete, only how many it did delete."

Anonymous  May 1999
Printed Page 315
footnote

"...by the owner" now reads "...by the file's owner."

Anonymous  Dec 2000
Printed Page 316
Code block

Change the five lines of code that did read:

while ($len = sysread IN, $buf, $blksize)) {
if (!defined $len) {
next if $! =~ /^Interrupted/;
die "System read error: $!
";
}

to instead read these seven lines of code:

while (1) {
$len = sysread IN, $buf, $blksize;
if (!defined $len) {
next if $! =~ /^Interrupted/; # ^Z and fg, rarely
die "System read error: $!
";
}
last unless $len;

Anonymous 
Printed Page 317
Changed "eaily tell" to "easily tell"

Anonymous  May 1999
Printed Page 317
In the last line of code, removed the bang, changing


unless (! $seen{$dev,$ino}++){

to

unless ($seen{$dev,$ino}++){

Anonymous  May 1999
Printed Page 317
Code under Discussion

Changed:
move("datafile.new","datafile.dat")
to:
move("datafile.dat","datafile.new")

Anonymous  Jan 2000
Printed Page 322
1st line:

"file;" now reads "filename;".

Anonymous  Dec 2000
Printed Page 324
In the first code example, changed this line

return if defined $age && $age > -M;

to read:

return if defined $age && $age > (stat($_))[9];

Anonymous  May 1999
Printed Page 324
In the paragraph under the first code example, changed

that lets it be called more grep or map.

to read:

that lets it be called like grep or map.

Anonymous  May 1999
Printed Page 325
Change the program listing of Example 9.3 to read as follows.

#!/usr/bin/perl
# rmtree1 - remove whole directory trees like rm -r
use File::Find;
die "usage: $0 dir ..
" unless @ARGV;
find {
bydepth => 1,
no_chdir => 1,
wanted => sub {
if (!-l && -d _) {
rmdir or warn "couldn't rmdir directory $_: $!";
} else {
unlink or warn "couldn't unlink file $_: $!";
}
}
} => @ARGV;

Anonymous 
Printed Page 325
first paragraph in the Discussion section should be changed to

File::Find has an alternate interface whose first argument is a
reference to a hash of options settings. The C<bydepth> makes
C<find> visit all files beneath a directory before the
directory itself--exactly what we need to remove a directory
and its contents. The C<no_chdir> option stops C<find> from
descending into directories. Finally, the C<wanted> option
takes a code reference, our old C<wanted()> function.

Anonymous 
Printed Page 325
3rd to last line of code

Indentation of `foreach...' is now flush left

Anonymous  Mar 2000
Printed Page 329
paragraph following "extension" subroutine

Change
If you want ".bak" returned, use '..*?' as the second...

to

If you want ".bak" returned, use '.[^.]*' as the second...

Anonymous 
Printed Page 330
1.-7

Unfortunately, you dare not preserve the directory permissions when you first
create the directory, because the directory might lack write permission, and
all subsequent link operations will then fail. You have to start out with
write permission, then go back and tighten up those that lacked it, after all
link creation is complete. (Since lacking write permission is rare, a hash of
exceptions could be maintained for the cleanup, or you could make a second
pass).

Anonymous 
Printed Page 330
1.17

07777 now reads 0777.

Anonymous  Dec 2000
Printed Page 330
1.23

chdir $srcdir;

now reads

chdir $srcdir or die "Can't chdir to $srcdir: $!";

Anonymous  Dec 2000
Printed Page 333
subroutine definitions for user and group

the line

$user{$uid} = getpwuid($uid)->name || "#$uid"

now reads

$user{$uid} = getpwuid($uid) ? getpwuid($uid)->name : "#$uid"

Likewise, the line

$group{$gid} = getgrgid($gid)->name || "#$gid"

now reads

$group{$gid} = getgrgid($gid) ? getgrgid($gid)->name : "#$gid"

Anonymous  Dec 2000
Printed Page 336
In the 2nd code example, changed

return sqrt( ($side1 ** 2) + ($side1 ** 2) );

To read:

return sqrt( ($side1 ** 2) + ($side2 ** 2) );

Anonymous  May 1999
Printed Page 340
In 10.3.4, "See Also" in "Creating Persistent Private Variables"

used to read:

The sections on "Closures" and on "Package Constructors and
Destructors: BEGIN and END" in Chapter 2 of _Programming Perl_;

However, Closures is in ch04, and BEGIN and END is in ch05. it now reads:

The sections on "Closures" and on "Package Constructors and
Destructors: BEGIN and END" in Chapters 4 and 5 of _Programming Perl_,
respectively;

Anonymous  Sep 1999
Printed Page 340
1st paragraph of Discussion section, the $ of $variable

is now is constant-width font.

Anonymous  Mar 2000
Printed Page 341
Changed "how many nested subroutine calls" to "how many frames (nested

subroutine calls)"

Anonymous  May 1999
Printed Page 352
Line 14

Changed "hander" to "handler."

Anonymous  Jan 2000
Printed Page 356
Paragraph above "See Also"

Changed:
"before Perl support proper references."
to:
"before Perl supported...."

Fixed alignments of functions under "Solution"


Anonymous  Jan 2000
Printed Page 358
In the 4th paragraph, changed "too late to useful" to

"too late to be useful"

Anonymous  May 1999
Printed Page 366
The 2nd paragraph used to read:

really meant "take the fourth element of @x"

It now reads:

really meant "take the fifth element of @x"

366) Also changed the 5th paragraph to read: "If you call ref on
a non-reference, it returns an empty string."

Anonymous  May 1999
Printed Page 367
Line 7

Deleted "an" from:
"through an undefined references"

Anonymous  Jan 2000
Printed Page 368

Figure 11-3:, the last two line of text now reads:

Changed:
print "$$a $b
";
3 3
to:
print "$$a
";
3

Anonymous  Jan 2000
Printed Page 369
Line -16

Deleted "create" from:
" thus creating create groups of people."

Anonymous  Jan 2000
Printed Page 371
Changed

# access Nth item (best)

To read:

# access item in position N (best)

Anonymous  May 1999
Printed Page 373
Under See Also, changed "Hashs of Arrays" to "Hashes of Arrays".

Anonymous  May 1999
Printed Page 373
Changed the text describing the 13.15 recipe to "Tie Example:

Make a Hash That Always Appends".

Anonymous  May 1999
Printed Page 373

Code under Solution used to read:

"key2" => "value2 ..."

Now reads:

"key2" => "value2", ...

Anonymous  May 1999
Printed Page 373
Also in the code, changed

@keys = keys %$hash;

To read:

@keys = keys %$href;

Anonymous  May 1999
Printed Page 381
In the 2nd paragraph, changed

the "prev" and "last" values

To read:

the "PREV" and "LAST" values

Anonymous  May 1999
Printed Page 385
Under Discussion, deleted: "We'll choose a key called

"Name" to hash them on:"


Anonymous  May 1999
Printed Page 385
In the 2nd code example, changed


my @fields = { split /^([^:]+):s*/m };

to

my @fields = split /^([^:]+):s*/m;

Anonymous  May 1999
Printed Page 385
Also changed


push(@Array_of_Records, { @fields });

to

push(@Array_of_Records, { map /(.*)/, @fields });


Anonymous  May 1999
Printed Page 390
2nd code block

The first and second-to-last lines of code have been changed. The code now
reads:

use Storable qw(retrieve_fd);
use Fcntl qw(:DEFAULT :flock);
open(DF, "< /tmp/datafile") or die "can't open /tmp/datafile: $!";
flock(DF, LOCK_SH) or die "can't lock /tmp/datafile: $!";
$href = retrieve_fd(*DF);
close(DF);

Anonymous  Aug 2001
Printed Page 393
In Example 11-1, changed


while ($n++ < 20) { insert($root, int(rand(1000)) }

to

while ($n++ < 20) { insert($root, int(rand(1000))) }

Anonymous  May 1999
Printed Page 398
Last line

Changed:
Poker::Deck::shuffle(23)
to:
Cards::Poke::shuffle(23)

Anonymous  Jan 2000
Printed Page 403

BEGIN {
unless (eval "use $mod") {
warn "couldn't load $mod: $@";
}
}

now reads

BEGIN {
eval "use $mod";
if ($@) { warn "$@"}
}

Anonymous  Dec 2000
Printed Page 413

12.6, "See Also" used to read:

the variable in the section on "Special Global
Variables" in Chapter 2 of Programming Perl

It now reads "Global Special Variables"

Anonymous  Sep 1999
Printed Page 417
6th paragraph; A step was missing. A line has been added before

"% make dist", so the code now reads:

% perl Makefile.PL
% make dist

Anonymous  Aug 2001
Printed Page 417
Last paragraph;

A period was added at the end of the last sentence.

Anonymous  Aug 2001
Printed Page 420
Under See Also, changed the mention of "SelfLoader" in the

SEE ALSO into "AutoLoader".

Anonymous  May 1999
Printed Page 429
Changed

MANIFEST | List of files in the distribution

to read as an entry in the table, not a column heading.

Anonymous  May 1999
Printed Page 430
-1.7


FineTime.ccc

now reads

Finetime.c && cc

Also, "FineTime.c" in "FineTime.cRunning" was moved to the previous line.

Anonymous  Dec 2000
Printed Page 432
Replaced sample paragraph as follows

If we had a I<.h> file with function prototype declarations,
we could include that, but since we're writing this one from
scratch, we'll use the B<-c> flag to omit building code to
translate any C<#define> symbols. The B<-n> flag says to
create a module directory named I<FineTime/>, which will have
the following files.

Anonymous  May 1999
Printed Page 435
last code comment

"have your own a" now reads "have your own".

Anonymous  Dec 2000
Printed Page 444
2nd paragraph, 2nd sentence rephrased

"Constructors don't have to be class methods; it's often
useful to have object methods that themselves return new
objects, as discussed..."

Anonymous  Mar 2000
Printed Page 446
Changed


$lector = Human::Cannibal->new();
$object->feed("Zak");
$object->move("New York");

to

$lector = Human::Cannibal->new();
$lector->feed("Zak");
$lector->move("New York");

Anonymous  May 1999
Printed Page 447
In the 3rd paragraph, last sentence rephrased

You could call a class method (one expecting a string
argument) on an object or an object method (one expecting
a reference) on a class,

Anonymous  Mar 2000
Printed Page 451

In 13.2, the "See Also" section used to read:

the section on "Garbage Collection" in Chapter 5

Should now reads:

the section "A Note on Garbage Collection"

Anonymous  Sep 1999
Printed Page 453
Right above the "bless" line in the example at the bottom,

changed the lone semicolon to read: "};"

Anonymous  May 1999
Printed Page 455
Example 13.4, "Solutions" section

sub DESTROY { --$BodyCount } # destructor

has been changed to:

sub DESTROY { --$Body_Count } # destructor

Anonymous  Aug 2001
Printed Page 457
This bug is a matter of versions. Under Perl release 5.6 and Class::Struct

version 0.58, only this line works:

@{$p->peers} = ("Wilbur", "Ralph", "Fred");

whereas this one does not, just as the submitted reported:

$p->peers( ["Wilbur", "Ralph", "Fred" ] ); # set its peers field

However, under Perl release 5.8 and Class::Struct 0.61,
I find that {both are, either is} fine.

I thus suggest making the two lines in question read:

@{$p->peers} = ("Wilbur", "Ralph", "Fred"); # set its peers field
$p->peers( ["Wilbur", "Ralph", "Fred" ] ); # also this way in Perl 5.8

Anonymous 
Printed Page 458
sub Person::age, line 5:

$struct->{'age'}
should be
$self->{'age'}

Anonymous 
Printed Page 459
2nd paragraph

Changed: "speed and space arrays..."
to: "speed and space of arrays..."

Changed:
struct Card => map { $_ => '$' } qw(name color cost type release text);
to:
struct Card => { map { $_ => '$' } qw(name color cost type release text) };
(added curly brackets)

Anonymous  Jan 2000
Printed Page 461

Changed the code that read:


if (@ISA && $proto->SUPER::can('new') {

to read

if (@ISA && $proto->SUPER::can('new')) {

Anonymous  May 1999
Printed Page 462
Near bottom

Changed "$obj2" to "$obj_target"


Anonymous  Jan 2000
Printed Page 469

Last line of code used to read "Jason"; it now reads :

"Kid's parent is Jason"

Anonymous  May 1999
Printed Page 470
Added a semicolon under See Also. Now reads:

"perltoot(1); Chapter 5 of Programming Perl;"

Anonymous  May 1999
Printed Page 476

2nd paragraph now reads:

Because an object is a higher-level notion than a raw
machine address, ^^^^

Anonymous  Mar 2000
Printed Page 477
Changed

sub StrNum($) {

to

sub StrNum {

Anonymous  May 1999
Printed Page 477
Output of show_strnum

Changed:
values are Red, Black, RedBlack, and 0
to:
values are Red, Black, RedBlack, and RedBlackRedBlackRedBlack

Anonymous  Jan 2000
Printed Page 478
In the concat function,

Changed:
return StrNum $inverted ? ($s2 . $s1) : ($s1 . $s2);
to:
return StrNum($inverted ? ($s2 . $s1) : ($s1 . $s2));

In the repeat function,
Changed:
return StrNum $inverted ? ($s2 x $s1) : ($s1 x $s2);
to:
return StrNum($inverted ? ($s2 x $s1) : ($s1 x $s2));

Anonymous  Jan 2000
Printed Page 484
Changed

push @{$self->{key}}, $value;

To read

push @{$self->{$key}}, $value;

Anonymous  May 1999
Printed Page 492
Changed

dbmopen %HASH, FILENAME, 0666 # open database, accessed through %HASH
or die "Can't open FILENAME : $!
";

To read:

dbmopen %HASH, $FILENAME, 0666 # open database, accessed through %HASH
or die "Can't open $FILENAME : $!
";

Also added a $ to each occurence of FILENAME, KEY, and VALUE.


Anonymous  May 1999
Printed Page 492
Code

Changed:
untie %hash; # close the database
to:
untie %HASH; # close the database

Anonymous  Jan 2000
Printed Page 494
Code

Changed:
untie %hash;
to:
untie %HASH;

Anonymous  Jan 2000
Printed Page 495
Top of page

Changed "Reads" and "writes" to "Read" and "write"

Anonymous  Jan 2000
Printed Page 497
Under Discussion, changed "With SDBM or GDBM" to "With SDBM or NDBM"

Anonymous  May 1999
Printed Page 504
Solution section

Changed:
"Use the CPAN module MLDBM to values more complex values"
to:
"Use the CPAN module MLDBM to store more complex values"

Anonymous  Jan 2000
Printed Page 510
Under "See Also"

The URL to the DBI docs online is no longer at symbolstone.org.

The correct URL to this documentation is now http://dbi.perl.org

Anonymous 
Printed Page 510
"See Also" section

This URL is out of date:

http://www.hermetica.com/technologia/perl/DBI/

The current location of the documents formerly found there now reads:

http://www.symbolstone.org/technology/perl/DBI/

Anonymous  Dec 2000
Printed Page 510.2.2
www.hermetica.com/technologia/perl/DBI/index.html

should be

www.arcana.co.uk/technologia/perl/DBI/

326.-2 # change $file
should be # change $newname

<technical, high>
Page 531,
Example 15-4 vbsh:
The last line of the code reads
$term->addhistory($seed_line);
But it should read
$term->addhistory($cmd);

<technical, high>
657.2
$pop->login($username, $password)
should be
defined($pop->login($username, $password))

<technical, high>
658
all occurences of
$pop->login(...)
should be
defined($pop->login(...))

<technical, high>
419.-1
expect to find them in Sample/auto/foo.al and Sample/auto/foo.al
should be
expect to find them in Sample/auto/foo.al and Sample/auto/bar.al

<technical, high>
86 line 3
$time = gettimeofday - $t1;
should be
$time = gettimeofday - $begin;

<technical,high>
165.5
($a = $b) =~ s/x/y/g; # copy $a and then change $b
should be
($a = $b) =~ s/x/y/g; # copy $b and then change $a

<technical, high>
31.-2.-2 return quoteword(",", 0, $_[0];
should be
return quoteword(",", 0, $_[0]);

<technical, high>
453.-1
;
bless($self, $class);
return $self;
should be
};
bless($self, $class);
return $self;

<technical, high>
449.5.4 bless($obref, $classname); # Mark it of the right type
should be
bless($self, $classname); # Mark it of the right type

<technical, high>
449.5.7 return $obref; # And give it back
should be
return $self; # And give it back

<technical, >
486.-3.1

[No way! Way!!] = EVIL>
should read
[No way! Way!!] => EVIL

p. 174
it would be much faster to use s/<[^>]*>//g
should be
it would be much faster to use s/<[^>]*>//gs

p. 237
There's no extra less than symbol
should be
There's no extra greater-than symbol

p.253
$rv = sysread(HANDLE, $buffer, $BUFSIZ);
or die "sysread: $!";
delete the "or die ..." line

Also, in the last page of the acknowledgements, Richard Allen
should be Richard Allan.

Anonymous  Dec 1998
Printed Page 512
Added a new final line to this page, indented to the same level

as the chop on the previous line:

next unless defined $href && defined $binary_time;

Anonymous  May 1999
Printed Page 516
Line above Discussion section

Changed:
# --output=string or --output=string
to:
# --output=string or --output string

Anonymous  Jan 2000
Printed Page 518
In the table, changed


option:i | Yes | Optional string parameter:

To read:

option:i | Yes | Optional integer parameter:

Anonymous  May 1999
Printed Page 519

Under "See Also," it used to read:

the -t file-test operator in Chapter 3 of Programming Perl

Should now reads:

-t file-test operator is in Chapter 2

Anonymous  Sep 1999
Printed Page 536
Under See Also, changed "by Don Libes, O'Reilly and Associates

(1996?)" to read "by Don Libes, O'Reilly and Associates (1995)"

Anonymous  May 1999
Printed Page 539
Changed

my $f = $menubar->Menubutton(-text => "File", -underline => 0,

To read:

my $f = $menubar->Menubutton(-text => "Edit", -underline => 0,

Anonymous  May 1999
Printed Page 555
Changed "Chapter 8 of Programming Perl" to "Chapter 6 of

Programming Perl"

Anonymous  May 1999
Printed Page 556
Deleted this line: ($pid = fork) ? waitpid($pid,0) : exec(@ARGV)

(last line of code).

Anonymous  May 1999
Printed Page 556
5th paragraph

"(but not backticks)" was removed.

Anonymous  Dec 2000
Printed Page 557
Changed Chapter 8 to 6 under See Also.

Anonymous  May 1999
Printed Page 558
Last paragraph

"The exec in Chapter 3" now reads "The exec function in Chapter 3"

Anonymous  Mar 2000
Printed Page 565
Changed strange-looking font in the right hand column.

Anonymous  May 1999
Printed Page 569

In "See Also" under section 16.8 the text used to read:

Special Global Variables

It now reads:

Global Special Variables

Anonymous  Sep 1999
Printed Page 579
Last block of code

print _POSIX_PIPE_BUF
now reads
print PIPE_BUF.

Anonymous  Mar 2000
Printed Page 604
In the 2nd code example, changed

socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

To read:

socket(TO_SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

Anonymous  May 1999
Printed Page 605
Changed

INADDR_ANY is a special address, meaning ``listen on any
interface''. If you want to restrict it to a particular IP
address, add a C<LocalAddr> parameter to your call to
C<IO::Socket::INET-E<gt>new>. If coding by hand code, do this:
to:
If you have several network interfaces, the kernel decides
which one to use based on your current routes. If you wish to
override this default, add a C<LocalAddr> parameter to your call
to C<IO::Socket::INET-E<gt>new>. If coding by hand code, do this:

Anonymous  Jan 2000
Printed Page 608
Removed the dollar sign in front $SERVER of both calls to fcntl().

Anonymous  May 1999
Printed Page 608
The URL

http://www.ecst.csuchico.edu/~guide/net

Is now

http://www.ecst.csuchico.edu/~beej/guide/net"

Anonymous  Sep 1999
Printed Page 609

2nd recv example; The first line used to read:

$server->recv($data_read, $flags)

It has been changed to:

$server->recv($data_read, $maxlen, $flags)

Anonymous  Aug 2001
Printed Page 617
under "Discussion" concerning UNIX Domain Datagram Server

The variable LocalAddr was changed to Local and PeerAddr was changed to Peer.

Anonymous  Dec 2000
Printed Page 618
If you want its actual host name

use Socket;

$other_end = getpeername(SOCKET)
or die "Couldn't identify other end: $!
";
($port, $iaddr) = unpack_sockaddr_in($other_end);
$actual_ip = inet_ntoa($iaddr);
$claimed_hostname = gethostbyaddr($iaddr, AF_INET);
@name_lookup = gethostbyname($claimed_hostname)
or die "Could not look up $claimed_hostname : $!
";
@resolved_ips = map { inet_ntoa($_) }
@ips_for_hostname[ 4 .. $#ips_for_hostname ];

But look at the misconnect between the variables used in the last two lines!
They now read:

@name_lookup = gethostbyname($claimed_hostname)
or die "Could not look up $claimed_hostname : $!
";
@resolved_ips = map { inet_ntoa($_) }
@name_lookup[ 4 .. $#name_lookup ];

Anonymous  Dec 2000
Printed Page 628
Fixed typo in See Also: now reads "The select function in.."

Anonymous  May 1999
Printed Page 630
In the code example, changed

if ($rv == length $outbuffer{$client} ||
{$! == POSIX::EWOULDBLOCK) {

It should read:

if ($rv == length $outbuffer{$client} ||
$! == POSIX::EWOULDBLOCK) {

Anonymous  May 1999
Printed Page 631

Second to last paragraph; The first sentence used to read:

We use getsockopt and setsockopt to turn on...

It has been changed to read:

We use fcntl to turn on...

Anonymous  Aug 2001
Printed Page 632
Fixed typo in See Also: now reads "The select function in.."

Anonymous  May 1999
Printed Page 634
Add this in the Solution just before the paragraph beginning

"Disassociate":

Close the three standard filehandles by reopening
them to F</dev/null>:

for my $handle (*STDIN, *STDOUT, *STDERR) {
open($handle, "+<", "/dev/null")
|| die "can't reopen $handle to /dev/null: $!";
}

Anonymous 
Printed Page 644

The 3rd paragraph used to read:

in Chapter 1, Web Automation.

It now reads:

in Chapter 20, Web Automation.

Anonymous  Sep 1999
Printed Page 645
Under Discussion, changed "and inet_aton to convert back:" to

read "and inet_ntoa to convert back:"

Anonymous  May 1999
Printed Page 648
First block of code

All double quotes are now straight quotes

Anonymous  Mar 2000
Printed Page 651
In the code example under Solution, changed


$mailer = Mail::Mailer->new();

to

$mailer = Mail::Mailer->new("sendmail");

Anonymous  May 1999
Printed Page 652
Changed

$mailer->open( 'From' => 'Nathan Torkington <gnat@frii.com>',
'To' => 'Tom Chritiansen <tchrist@perl.com>',
'Subject' => 'The Perl Cookbook' );
to:
$mailer->open( { From => 'Nathan Torkington <gnat@frii.com>',
To => 'Tom Chritiansen <tchrist@perl.com>', Subject => 'The Perl Cookbook' } );
(Note addition of {} around the parameter.
Omission of the ')


Anonymous  Jan 2000
Printed Page 655

In the last paragraph, changed "NetNews Transfer Protocol" to read:

"Network News Transfer Protocol"

Anonymous  May 1999
Printed Page 656
In the first code example, changed

or die "Can't fetch article $article_number: $!
";

To read:

or die "Can't fetch article $message_id: $!
";

Anonymous  May 1999
Printed Page 658
2nd paragraph

The example coded now reads:

$undeleted = $pop->list();
foreach $msgnum (keys %$undeleted) {
$msgsize = $undeleted->{$msgnum};
print "Message $msgnum is $msgsize bytes long.
";
}

Anonymous  Dec 2000
Printed Page 659
Under See Also, changed "RCS 1734" to "RFC 1734"

Anonymous  May 1999
Printed Page 661
Fixed the typo under See Also. It now reads: "The documentation

for the Net::Telnet"

Anonymous  May 1999
Printed Page 661
Fixed the typo in the 2nd paragraph under Discussion; 2nd sentence

now reads: "The machine is considered unreachable"

Anonymous  May 1999
Printed Page 669

Moved parantheses in the 2nd sentence. Now reads:


(Don't confuse HTTP methods with the methods of
object-orientation. They have nothing to do with
each other).

Anonymous  May 1999
Printed Page 677
Changed the version output from "2.40" to "2.49".

Anonymous  May 1999
Printed Page 677

Changed last paragraph to read:

prints @INC (Perl's array of directories it looks for
^^^^^

Anonymous  May 1999
Printed Page 679
In the third bullet item under Solution, changed "quite by talking"

to "quit by talking".

Anonymous  May 1999
Printed Page 684
Code

Changed:
die "cannot fork: $!" unless defined ($pid = open(SAFE_KID, "|-"));
to:
die "cannot fork: $!" unless defined ($pid = open(SAFE_KID, "-|"));

Anonymous  Jan 2000
Printed Page 685
Deleted

$pid = open(KID_TO_WRITE, "|-");
which was above line:
die "cannot fork: $!" unless defined($pid = open(KID_TO_WRITE, "-|"));

Anonymous  Jan 2000
Printed Page 691
In example 19-6, changed

my $server = HTTP::Daemon->new(Timeout => 60);

To read:

my $server = HTTP::Daemon->new(Timeout => 60, LocalPort => 8989);

Anonymous  May 1999
Printed Page 698
In the 2nd code example, changed

print header("Program Title"), begin_html();

It now reads:

print header("Program Title"), start_html();

Anonymous  May 1999
Printed Page 707
In the table, deleted two lines: "LWP::UserAgent" and "URI::URL"

Anonymous  May 1999
Printed Page 708
Under Discussion, changed

We use four different modules from LWP.

To read:

We use three modules from LWP and one other from CPAN.

Anonymous  May 1999
Printed Page 711

Changed "isn't <EASY> and <FUN>" would yield:" to read :

"isn't <EASY>&<FUN>" would yield:

Anonymous  May 1999
Printed Page 716
Under Solution, changed "the LWP modules:" to read "the CPAN modules:"

Anonymous  May 1999
Printed Page 716

third paragraph now reads:

A correct but slower and slightly more complicated way is
to use the HTML-Tree bundle of modules from CPAN:

Anonymous  Dec 2000
Printed Page 717
In the 2nd paragraph, changed "the HTML parsing routines from LWP"

to read "the HTML parsing routines from CPAN"

Anonymous  May 1999
Printed Page 717
And in the next paragraph, changed "subclass LWP's HTML::Parser class"

to read "subclass the HTML::Parser class"

Anonymous  May 1999
Printed Page 720
In Example 20-6, changed

my($req, $ans);

To read:

my $ans;

Anonymous  May 1999
Printed Page 722
In the second code example, changed

{ int($seconds / 60) } minutes.

To read:

{ int($total / 60) } minutes.

Anonymous  May 1999
Printed Page 722
Under Discussion, changed "$whats_his_name, $login_count, and

$minute_used" to read "$username, $count, and $total"

Anonymous  May 1999
Printed Page 723
In Example 20-7, changed

'total' => $total

To read:

'total' => $seconds

Anonymous  May 1999
Printed Page 723
In Example 20-7, changed

'total' => $seconds

To read:

'total' => $total

Anonymous  Sep 1999
Printed Page 726
Deleted the pipe and the line between "Disallow: /" and

"User-agent: Mozilla ..."

Anonymous  May 1999
Printed Page 731

{731} Changed `index.html' to `scooby.html'

Anonymous  Jan 2000
Printed Page 737
In the Index, changed

binary numbers, convering with decimal numbers, 48-49

Now reads:

binary numbers, converting with decimal numbers, 48-49

Anonymous  May 1999
Printed Page 738
Changed

comments, in regular expressins

To read:

comments, in regular expressions

Anonymous  May 1999
Printed Page 741
Changed "escaping chacters" to "escaping characters"

Anonymous  May 1999
Printed Page 742
Changed "FileHandler" to "FileHandle"

Anonymous  May 1999
Printed Page 743
Index

getsockopt() has been deleted from the index.

Anonymous  Aug 2001
Printed Page 746
Deleted "LWP::Heuristic"

Anonymous  May 1999
Printed Page 749
Changed "pattern-matching" to "pattern matching"

Anonymous  May 1999
Printed Page 749
Changed "multiple-byte charactrs" to "multiple-byte characters"

Anonymous  May 1999
Printed Page 750
Added page 110 to prototypes entry

Anonymous  May 1999
Printed Page 752
Index

"Schwartzian Transformation" should be added, indexed to page 120.

Anonymous 
Printed Page 752
Index

setsockopt() used to be indexed to page 631. It is now indexed to page 610.

Anonymous  Aug 2001
Printed Page 756

(756) Added page 709 to URI::Heuristic entry

Anonymous  May 1999