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 "Date Corrected".
The following errata were submitted by our customers and approved as valid errors by the author or editor.
Version |
Location |
Description |
Submitted By |
Date submitted |
Date corrected |
|
APPA
first exercise |
Code sample generates one warning and one error if run with perl -w.
The problem is with the file test.
#!/usr/bin/perl
my @smaller_than_1000 = grep { -s < 1000 } @ARGV;
print map { " $_\n" } @smaller_than_1000;
the -s < is ambiguous to the interpreter, so fails when the interpreter tries to resolve < to the first part of a diamond operator.
grep { (-s) < 1000 } @ARGV; # works
grep { 1000 > -s } @ARGV; # also works
The same applies for the one-liner 2nd example:
print map { " $_\n" } grep { -s < 1000 } @ARGV;
This is covered in Programming Perl pg 97.
Thanks
Note from the Author or Editor: Fix as
grep { (-s) < 1000 } @ARGV; # works
|
Anonymous |
Jul 28, 2008 |
|
Printed |
Page 7
Top of page |
Remove the ending right parenthesis ")" after "list context"
|
Anonymous |
|
Feb 01, 2007 |
PDF |
Page 8
First paragraph, first sentence. |
The words "that" and "modules" appear to have been swapped and the word "with" seems superfluous. The sentence currently reads:
Throughout this book, we?ll try to identify that modules come with perl (and usually,
with which version of perl first included them).
This should probably read:
Throughout this book, we?ll try to identify modules that come with perl (and usually,
which version of perl first included them).
(Note that I previously reported an error in this sentence, but did not include removal of the word "with" in that report.)
|
Mx |
Aug 30, 2012 |
|
PDF |
Page 10
First paragraph, first sentence, 3rd word. |
The line currently reads:
We?ve included on the top portion of the documentation to show the most important
This is referring to the top part of the output of "perldoc File::Basename". The word "on" is not appropriate. Should probably read:
We?ve included the top portion of the documentation to show the most important
|
Mx |
Aug 29, 2012 |
|
Printed |
Page 11
second footnote |
"Although we don't go into here"
should be
"Although we don't go into it here".
|
Anonymous |
|
Feb 01, 2007 |
Printed |
Page 13
3rd paragraph, last sentence |
The value of $basename should be "plan7.rtf", not "plan 7.rtf". No embedded space.
|
Anonymous |
|
Feb 01, 2007 |
PDF |
Page 15
6th paragraph |
Sentence starts with
If we have the a recent version of Perl, should also already have Module::CoreList
This should probably be:
If we have a recent version of Perl, we should also already have Module::CoreList
Note from the Author or Editor: Changed as noted in r546856.
|
Marnix A. van Ammers |
Aug 19, 2012 |
|
Printed |
Page 17
last paragraph |
"One way to fix this is to add a BEGIN block around the push" should be "One
way to fix this is to add a BEGIN block around the unshift".
|
Anonymous |
|
|
PDF |
Page 18
3rd paragraph. |
Middle of paragraph seems to be missing the word "do". Line shows as:
as friendly since not only we have to change the code but also because it might not be
Should probably be:
as friendly since not only do we have to change the code but also because it might not be
|
Mx |
Aug 29, 2012 |
|
Printed |
Page 20
2nd Paragraph, last sentence |
It appears that there is no longer a "country_code" method available in the Business::ISBN module. I am assuming you meant "group_code"?
Note from the Author or Editor: country_code was correct at the time of printing. The module changed to group_code, the correct term according to the ISBN Agency, after printing.
|
Lucas Marshall |
Oct 07, 2009 |
|
Printed |
Page 25
3rd paragraph |
"Now instead of copying the entire provision list into the @_ array, we get A SINGLE ELEMENT OF A REFERENCE to that provisions array."
shouldn't it say "we get a single element, which is a reference to that provisions array."
maybe showing a major lack of my understanding but this doesn't quite make sense to me.
Note from the Author or Editor: change to "we get a single element which is a reference to
that provisions array.".
|
Lucas Marshall |
Oct 07, 2009 |
|
Printed |
Page 39
Last paragraph |
"When we compare reference with ==" should read "When we compare references with =="
Note from the Author or Editor: Change as noted
|
cg |
Nov 11, 2012 |
|
Printed |
Page 41
Last paragraph - code |
['The Professor', [qw(sunscreen water_bottle slide_rule radio) ]],
should be
['The Professor', [qw(sunscreen water_bottle slide_rule batteries radio) ]],
|
Anonymous |
|
Feb 01, 2007 |
Printed |
Page 50
3rd paragraph |
"The show_hash subroutine expects a hash and ..." should read
"The show_hash subroutine expects a hash reference and ..."
Note from the Author or Editor: Change as noted
|
cg |
Nov 11, 2012 |
|
Printed |
Page 60
the code at the bottom of the page, |
vfor 'The Professor':
[qw(sunscreen water_bottle slide_rule radio)]
should be:
[qw(sunscreen water_bottle slide_rule radio batteries)]
|
Anonymous |
|
Feb 01, 2007 |
Printed |
Page 80
Second paragraph under "The Improved Way" |
Currently reads:
----
If the scalar already has a value, this doesn't work because Perl won't stomp on our
data.
----
This should read:
----
If the scalar already has a value, this doesn't work because Perl won't stomp on our
data. Perl tries to use the value in C<$log_fh> as a symbolic reference, so it tries
to print to the filehandle named C<5>. Under C<use strict>, this is a fatal error.
----
|
Anonymous |
|
|
Printed |
Page 80
4th paragraph, not including code blocks |
In the 10/07 printing, it currently reads:
'...Perl tries to use the value in C<$log_fh> as a symbolic reference, so it tries to print to the filehandle named C<5>. Under C<use strict>, this is a fatal error.'
The 'C<...>' text is in a larger monospace font never before used before in the book. I saw a note about this in errata for the most recent printing saying to *add* this sentence. I'm guessing they meant that C<alpha> signifies that 'alpha' should be formatted as code.
Note from the Author or Editor: Remove the C<> formatting codes and print their contents in the code font.
|
Anonymous |
|
|
Printed |
Page 83
First code example in 'Anonymous IO::File Objects' |
The arguments to the calls to IO::File->new are single-quoted strings but the strings contain
references to $file and $out. I'm guessing interpolation was expected, in which case the strings
should be double-quoted.
Note from the Author or Editor: Change to double quotes as noted in calls to IO::File->new().
|
Anonymous |
|
|
Printed |
Page 84
United States |
In line 6 IN should be $IN::
1 while (@handlepairs) {
2 @handlepairs = grep {
3 my ( $IN, $OUT ) = @$_;
4 my $line;
6 defined( $line = <IN> ) and print $OUT $line;
7
8 } @handlepairs;
Note from the Author or Editor: Fixed in sources (revision 426516)
|
Anonymous |
Dec 13, 2011 |
|
Printed |
Page 85
First code example under IO::Tee |
The first open statement:
or die "Could not open castaways.log;
should read
or die "Could not open castaways.log"
Note from the Author or Editor: Should read:
or die "Could not open castaways.log";
|
Anonymous |
|
|
Printed |
Page 86
Top half of page, 1st code example folowwing paragraph beginning: "That's not all" |
The last statement, "print," causes a warning that says the filehandle is opened for input only.
It also causes an additional and unwanted output operation to the intended output files because
the output is first accomplished via the preceding line:
my $message = <$tee_fh>;
This is consistent with the documentation for the IO:Tee module at the end of the paragraph
beginning with, "The second way."
Note from the Author or Editor: Remove the `print` line, which causes double output.
|
Anonymous |
|
|
Printed |
Page 91
Last paragraph |
"Professor is position 2"
should read,
"Professor is position 3"
Note from the Author or Editor: Change as noted
|
Anonymous |
|
|
Printed |
Page 95
as shown |
In the section "Building Recursively Defined Data" in Chapter 9, a code bit reads:
#####
my $skipper_home = {
'.cshrc' => undef,
Please_rescue_us.pdf => undef,
Things_I_should_have_packed => undef,
bin => {
navigate => undef,
discipline_gilligan => undef,
eat => undef,
},
};
#########
It should quote the keys for 'Please_rescue_us.pdf' and 'Things_I_should_have_packed', like this:
#########
my $skipper_home = {
'.cshrc' => undef,
'Please_rescue_us.pdf' => undef,
'Things_I_should_have_packed' => undef,
bin => {
navigate => undef,
discipline_gilligan => undef,
eat => undef,
},
};
#########
|
Anonymous |
|
|
Printed |
Page 99
code after 1st paragraph |
[10/07] printing
my %directory = %$data;
is unnecessary. Also, 3rd line later:
dump_data_for_path("$path/$_", $data->{$_});
Exercises Ch. 9 #4 pp 232-233, similar changes
Note from the Author or Editor: We don't really need it, but there's no harm. It's only there to avoid dereferencing syntax. We can change this in the next edition.
|
Anonymous |
|
|
Printed |
Page 128
towards the top of page |
The only difference between a class method and an instance method is
whether the first parameter is an instance (a blessed reference) or a
class name (a string).
should read instead:
The only difference between a class method and an instance method is
whether the first parameter is a class name (a string) or an instance (a
blessed reference).
|
Anonymous |
|
|
Printed |
Page 132
First code example inside paragraph starting "Let's make a sheep" |
my $lost = bless { Name => 'Bo', Color => 'white' }, Sheep;
should read
my $lost = bless { Name => 'Bo', Color => 'white' }, 'Sheep';
Note from the Author or Editor: Change as noted
|
Anonymous |
|
|
Printed |
Page 135
sub rightmost |
The rightmost() function doesn't really find the rightmost match. Just imagine that "Both Gilligan and Ginger like Ginger Ale."
The assignment to $position is missing a "my".
Note from the Author or Editor: I fixed the missing 'my', but I don't see the problem with the first issue.
|
cg |
Nov 21, 2012 |
|
Printed |
Page 137
top of page |
"We've been burned in the past when a setter became a getter because
another function returned more parameters than expected after an
upgrade."
should read:
"We've been burned in the past when a getter became a setter because
another function returned more parameters than expected after an
upgrade."
|
Anonymous |
|
|
Printed |
Page 137
4th line of the first paragraph |
"setter became a getter"
should read
"getter became a setter"
Note from the Author or Editor: Change as noted
|
Anonymous |
|
|
Printed |
Page 151
code |
if (-f $path or -l $path) {
must read
if (-l $path or -f $path) {
You must check symbolic links first because otherwise you would populate the tree with the data for the link targets and might also create that circular loop you warn about in the text ...
Aside from that, you could use "_" in all following file tests as recommend in "Learning Perl".
Note from the Author or Editor: Change that line to
if (−l $path or −f _) { # symbolic links or files
|
cg |
Nov 21, 2012 |
|
Printed |
Page 158
4th code snippet, just after the sentence 'If it is neither, death awaits:' |
In "Intermediate Perl", 2nd Edition, chapter 14, under the topic of "Using AUTOLOAD for Accessors", the last code snippet reads:
croak "$_[0] does not understand $method\n";
If you just use the 'sub AUTOLOAD' definition from this page, the variable $method is never declared or set prior to its usage in this statement. It appears to be copied/pasted from the previous AUTOLOAD definition on page 157. Is this definition (p. 158) supposed to be part of the previous definition (p. 157)?
It doesn't appear so, but I'm still learning, so wasn't sure. It could be fixed by adding the line '(my $method = $AUTOLOAD) =~ s/.*:://s;' from the previous definition.
Note from the Author or Editor: Change the code right after the paragraph "If it is neither, death awaits" to
(my $method = $AUTOLOAD) =~ s/.*:://s; # remove package name
croak "$_[0] does not understand $method\n";
}
|
Roman Daszczyszak |
Dec 31, 2009 |
|
Printed |
Page 161
first paragraph |
All references to subclasses should be turn to superclasses. You don't inherit
from subclasses.
Note from the Author or Editor: Change as noted
|
Anonymous |
|
|
Printed |
Page 174
last code sample before "README" section |
$ make ziptest
should be
$ make zipdist
|
Anonymous |
|
|
Printed |
Page 197
last code example from section "Writing Tests with Test::More" |
While talking about the string form of the regular expression, the second argument to like() is still given as a regex reference:
like($subtract, qr/^-?0$/, '-3 + 3 == 0');
This should read
like($subtract, '/^-?0$/', '-3 + 3 == 0');
instead.
Note from the Author or Editor: This is the line of code above the paragraph which is above the heading "Testing Object-Oriented Features". That line of code should read:
like($subtract, '^-?0$', '-3 + 3 == 0');
|
Anonymous |
Nov 08, 2008 |
|
PDF |
Page 202
Below "The lib/Cow.pm file:" |
package Cow;
use parent qw(Cow);
sub sound { 'neigh' }
1;
... should be ...
package Cow;
use parent qw(Animal);
sub sound { 'moooo' }
1;
Note from the Author or Editor: Fixed in r546857.
|
Jozef Reisinger |
Aug 16, 2012 |
|
Printed |
Page 214
section "Writing Your Own Test::* Modules", last paragraph, first sentence |
[...], how we do we test the test?
should probably read
[...], how do we test the test?
Note from the Author or Editor: Change as noted
|
Anonymous |
Nov 10, 2008 |
|
Printed |
Page 221
first exercise |
Code sample generates one warning and one error if run with perl -w.
The problem is with the file test.
#!/usr/bin/perl
my @smaller_than_1000 = grep { -s < 1000 } @ARGV;
print map { " $_
" } @smaller_than_1000;
the -s < is ambiguous to the interpreter, so fails when the interpreter tries to resolve < to the first part of a diamond operator.
grep { (-s) < 1000 } @ARGV; # works
grep { 1000 > -s } @ARGV; # also works
The same applies for the one-liner 2nd example:
print map { " $_
" } grep { -s < 1000 } @ARGV;
Note from the Author or Editor: Change to have parens around the -s calls. All -s should be (-s).
|
Anonymous |
|
|
Printed |
Page 221
excercise 1 answer for Chapter 2 |
my @smaller_than_1000 = grep { -s < 1000 } @ARGV;
should be:
my @smaller_than_1000 = grep { -s $_ < 1000 } @ARGV;
|
Anonymous |
|
Feb 01, 2007 |
Printed |
Page 223
Exercise 2 |
"country_code" method seems to no longer exist.
Note from the Author or Editor: The country_code method is now the group_code method. The book was correct at the time of printing.
|
Lucas Marshall |
Oct 07, 2009 |
|
Printed |
Page 229
Bottom section of the page |
The answer to exercise 8-2 doesn't work with the current versions of Perl and IO::File. I'm not sure if this is a change in IO::File or if the answer as written never worked.
The problem line is this:
my $handle = $output_handles{$name} ||=
IO::File->open(">$name.info") || die "Cannot create $name.info: $!";
As written, that produces this error: Can't use string ("IO::File") as a symbol ref while "strict refs" in use at /home/telemachus/lib/perl5/5.10.0/i686-linux/IO/File.pm line 185, <> line 1.
However, if you change IO::File->open to IO::File->new everything works just fine.
Note from the Author or Editor: In the code under "Exercise 2", change the line:
IO::File->open(">$name.info") || die "Cannot create $name.info: $!";
to:
IO::File->new(">$name.info") || die "Cannot create $name.info: $!";
where we replace "open" with "new".
|
Anonymous |
Dec 28, 2008 |
|
Printed |
Page 231
4th line of code listing |
while( my $file = $dh->read ) {
should read
while( defined(my $file = $dh-> read) ) {
Otherwise the while can potentially abort prematurely atleast for the case where
there is a file named '0' in the directory.
Note from the Author or Editor: Change as noted
|
Anonymous |
|
|
Printed |
Page 231
Exercise 2 |
The code of Exercise 2 is not correct.
The Ordinary "is" still faster.
The solution was in the comments to the quoted URL: http://www.perlmonks.com/?node_id=393128
The @files is not known to Benchmark. With the code on p 231 the Ordinary is still faster, but
@files is empty. Probably most clear is to change the q{} to sub {} in the code for the Ordinary
and Schwartzian.
Running with the q{} quoted code of the example:
Benchmark: running Ordinary, Schwartzian for at least 2 CPU seconds...
Ordinary: 2 wallclock secs ( 2.03 usr + 0.00 sys = 2.03 CPU) @ 398461.58/s (n=808877)
Schwartzian: 3 wallclock secs ( 2.04 usr + 0.03 sys = 2.07 CPU) @ 337243.48/s (n=698094)
Changing q{} to sub {} shows the following results
Running with the sub on /etc/* (81 files):
Benchmark: running Ordinary, Schwartzian for at least 2 CPU seconds...
Ordinary: 3 wallclock secs ( 0.38 usr + 1.73 sys = 2.11 CPU) @ 58.77/s (n=124)
Schwartzian: 2 wallclock secs ( 1.21 usr + 0.84 sys = 2.05 CPU) @ 214.63/s (n=440)
Running with the sub on /bin/* (81 files):
Benchmark: running Ordinary, Schwartzian for at least 2 CPU seconds...
Ordinary: 3 wallclock secs ( 0.35 usr + 1.66 sys = 2.01 CPU) @ 129.85/s (n=261)
Schwartzian: 2 wallclock secs ( 1.12 usr + 1.00 sys = 2.12 CPU) @ 416.98/s (n=884)
This is perl, v5.8.6 built for darwin-thread-multi-2level
on Mac OS X 10.4.9 G3 500 MHz.
Note from the Author or Editor: Change as noted.
|
Anonymous |
|
|
Printed |
Page 241
Exer 2 solution |
locatime needs to be localtime()
Note from the Author or Editor: Change as noted.
|
Anonymous |
|
|
Printed |
Page 244 f.
tests code example |
The test for shuffle() is totally broken.
First of all, the least serious problem is a typo on page 244, next to last line: it should read $shuffled->[$index] instead of $shuffle->[$index] (note: shuffled vs. shuffle).
However, the whole comparing doesn't make any sense. Both $array and $shuffled are references to the same (anonymous) array, and after the array elements have been shuffled both of them still point to that array. Thus comparing their elements means comparing each array element to itself. And of course this leads to $same_count always being `scalar @$array'.
And even if these problems were fixed, the call to cmp_ok() doesn't make sense. All array elements may have retained their position, but they might as well all have changed it; and of course everything in between is also possible. It probably makes most sense here to compare the elements of the _sorted_ original and shuffled arrays.
Note from the Author or Editor: For the code at the bottom of page 244, there are two errors:
The line that reads:
my $shuffled = $array;
should read
my $shuffled = [ @$array ];
And, the second code line from the bottom of the page has an incorrect variable name. The name is written as "$shuffle", but should be "$shuffled" with a "d" at the end:
$same_count++ if $shuffled->[$index] eq $array->[$index];
|
Anonymous |
Nov 10, 2008 |
|
Printed |
Page 244
3rd paragraph and code below it |
The text mentions making a copy of the array.
In the code below the reference is copied. Both $array and $shuffled therefore still point to
the same data.
The test will not work.
Note from the Author or Editor: The offending line is:
my $shuffled = $array;
That should be:
my $shuffled;
@shuffled = @$array;
|
Anonymous |
|
|
Printed |
Page 245
Code |
use Exporter is redundant, use base qw(Exporter) already takes care of that.
Note from the Author or Editor: remove the line that says
use Exporter;
|
Anonymous |
|
|
Printed |
Page 316
United States |
2nd edition, answer to exercise 1 of chapter 4.
Figure A-2, it should be "@ginger" instead of "$ginger".
Note from the Author or Editor: In Figure A-2, there's a box with "$ginger" in it. It should be "@ginger" as noted.
|
Harry Pan |
Sep 05, 2012 |
|
Mobi |
Page 1111
Amazon cloud reader - page/paragraph unknown |
i apologize for not having error location info, but the Amazon cloud reader seems to take that away from me. It's telling me "location 616 of of 15285."
In the intro chapter regarding perl modules:
"To make perl look in that directory for modules..... Here's how we'd do that for the Bourne shell:"
% export PERL5LIB=...
The errata: that would not work on a Bourne shell. It would work in the Bourne Again and several others, but Bourne requires a separation of the export and the assignment:
% PERL5LIB=...
% export PERL5LIB
Happy Hacking!
Note from the Author or Editor: Noted. I should have said bash.
|
Stephan Beal |
Jul 08, 2013 |
|