Errata for Learning Perl
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 "Date 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 Note Update
| Version |
Location |
Description |
Submitted By |
Date Submitted |
Date Corrected |
| Safari Books Online |
5.4
Fourth paragraph of section 5.4-don't know page #-reading electronically |
Book probably reads:
fred
barney
betty
But online version displays:
fred
barney
betty
Note from the Author or Editor: There should be some non-collapsing space in front of those words, so the beginning of each line starts with a space.
|
Anonymous |
Jun 28, 2011 |
Oct 14, 2011 |
| Other Digital Version |
8
3rd paragraph (second full paragraph) |
The first sentence of the 3rd paragraph ends "... even to the point that it's main implementation goes by the name Rakudo."
It should read "... that its main implementation ..." [it's --> its]
The word "it's" (with an apostrophe) is the contraction of "it is" or "it has". The word "its" (without an apostrophe) is the possessive form. In fact, not one of the possessive pronouns or adjectives in English is ever written with an apostrophe.
<aside>
Another popular error these days is to use "who's", which is the contraction of "who is" or "who has", instead of "whose", which is the relative possessive pronoun.
</aside>
Note from the Author or Editor: Change as noted.
|
William Bresler |
Aug 08, 2011 |
Oct 14, 2011 |
| PDF |
Page 30
chapter 2, scalar data |
but a variable you use throughout a program should probably have a more descriptive name to not only remind you want [what] it does, but let other people know what it does
Note from the Author or Editor: In the second to last line on p.30, "you want" should become "you what". This is the last sentence in the first paragraph of "Choosing Good Variable Names".
|
Anonymous |
Sep 22, 2011 |
Oct 14, 2011 |
| Safari Books Online |
37
2nd line from bottom |
"programmers’ text editor"
should be
"programmer’s text editor"
Note from the Author or Editor: Change as noted
|
Grzegorz Szpetkowski |
Sep 03, 2011 |
Oct 14, 2011 |
| PDF |
Page 50
2nd para, 2nd line, |
rule in Perl: as long you don’t change the meaning by removing the parentheses,
should be:
rule in Perl: as long _as_ you don’t change the meaning by removing the parentheses, (emphasis with underscore)
Note from the Author or Editor: Change as noted
|
Anonymous |
May 09, 2012 |
|
| Printed |
Page 51
First example, top of page |
@array = qw( pebbles dino fred barney betty );
@removed = splice @array, 2; #remove everything after fred
# @removed is qw( fred barney betty )
# @array is qw( pebbles dino)
Shouldn't the first comment read "#remove fred and everything after" since "fred" is removed as well.?
Note from the Author or Editor: Change as noted
|
Anonymous |
Aug 16, 2011 |
Oct 14, 2011 |
| Safari Books Online |
55
3rd code listing |
Compilation error (Global symbol "@rocks" requires explicit package name at) due to "use 5.012;" pragma. As I checked that pragma implies "use strict;", so you could change it to "use feature ':5.12';" (looks bad) or just change "@rocks" to "my @rocks" (latter solution looks simpler, because you have already "my( $index, $value )").
Note from the Author or Editor: Change as noted
|
Grzegorz Szpetkowski |
Aug 29, 2011 |
Oct 14, 2011 |
| PDF |
Page 56
2nd paragraph |
On page 56, second paragraph, there's a part explaining the different results from 2*3 and 2x3 and it says "The first gives you 8" which is wrong. 2*3 is 6 I believe unless you meant 2**3 which is actually 8 but then you have to correct 2*3 to 2**3.
Note from the Author or Editor: Change "The first gives you 8 while the second gives you 222" to "The first gives you 6 while the second gives you 222"
|
Navid Paya |
Aug 28, 2012 |
|
| Printed |
Page 85
after 3rd paragraph |
"can't open wimla: No such file or directory"
should be
"can't open wilma: No such file or directory"
Note from the Author or Editor: Fixed in the sources
|
aphilipp |
Jan 08, 2012 |
Jan 13, 2012 |
| Safari Books Online |
96
3rd code line |
binmode STDERR, ':encoding(UTF-8)';
should be
binmode STDIN, ':encoding(UTF-8)';
Note from the Author or Editor: Change as noted
|
Grzegorz Szpetkowski |
Sep 02, 2011 |
Oct 14, 2011 |
| PDF |
Page 104
1st paragraph |
"Perl realizes that $fh is a filehandle"
should be
"Perl realizes that $rocks_fh is a filehandle"
Note from the Author or Editor: Fixed in the sources
|
aphilipp |
Jan 25, 2012 |
|
| PDF |
Page 115
before title 'Hash Functions' |
$hash{ bar.foo } = 1; # that's the key 'foobar'
should be:
$hash{ bar.foo } = 1; # that's the key 'barfoo'
Note from the Author or Editor: Change as noted.
|
chunzi |
Aug 23, 2011 |
Oct 14, 2011 |
| Safari Books Online |
123
6th paragraph |
if (/\p{Hex}\p{Hex}/) {
print "The string has a pair of hex digits.\n";
}
should be (to be suitable with previous [0-9A-Fa-f], character class):
if (/\p{AHex}\p{AHex}/) { # 22 different possible characters
print "The string has a pair of hex digits.\n";
}
Unicode property Hex_Digit is broader than ASCII_Hex_Digit (http://unicode.org/cldr/utility/properties.jsp).
Note from the Author or Editor: Change as noted. We don't need the full-width versions of the characters.
|
Grzegorz Szpetkowski |
Sep 19, 2011 |
Oct 14, 2011 |
| Safari Books Online |
123
5th paragraph |
if (/\p{Digit}/) { # 411 different possible characters
should be (because of update for Perl 5.14 with Unicode Version 6.0.0):
if (/\p{Digit}/) { # 420 different possible characters
More information:
http://perldoc.perl.org/perluniprops.html
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:General_Category=Decimal_Number:]
Note from the Author or Editor: Update as noted.
|
Grzegorz Szpetkowski |
Oct 16, 2011 |
Jan 13, 2012 |
| Safari Books Online |
127
1st paragraph |
"Perl will create as many back references as it needs, so it assumes that you mean \111. Since you don’t have 111
(or 11) capture groups, Perl complains when it tries to compile the program."
I think that information is not quite true. Actually in such situation Perl treats clearly \111 as octal escape syntax (decimal 73). Check:
$_ = "aaIbb";
if (/(.)\111/) {
print "It matched!\n";
}
According to perlre only backreferences \1 through \9 are "guaranteed", for higher number Perl is smart enough to count left parentheses. I think that might be good option to make some footnote on this issue.
Note from the Author or Editor: Fixed in the sources
|
Grzegorz Szpetkowski |
Sep 14, 2011 |
Jan 13, 2012 |
| Safari Books Online |
129
footnote |
"Even under Unicode semantics, the \s still doesn’t match the vertical tab, next line, or nonbreaking space."
That seems to be untrue in Perl 5.14:
#!/usr/bin/perl -w
use 5.014;
use charnames qw(:full);
my @chars = ("\N{LINE TABULATION}", "\N{NO-BREAK SPACE}", "\N{NEXT LINE}");
foreach (@chars) {
if (/\s/u) { # Unicode semantics explicitely by /u
printf "%s is matched\n", charnames::viacode(ord);
}
}
Result is (that is, only vertical tab is unmatched):
NO-BREAK SPACE is matched
NEXT LINE (NEL) is matched
Note from the Author or Editor: I shouldn't have used "semantics" in the footnote because I wasn't considering the /u. The footnote really refers to the Unicode Space property.
|
Grzegorz Szpetkowski |
Nov 03, 2011 |
|
| Safari Books Online |
130
3rd line |
there is:
"just like you did with /d:"
should be:
"just like you did with \d:"
Also you might consider dropping unnecessary square brackets on previous page (129), that is "/HAL-[\d]+" into "/HAL-\d+" (two occurences in code examples on that page).
Note from the Author or Editor: Change the /d to \d, but leave the other suggestions as is.
|
Grzegorz Szpetkowski |
Sep 04, 2011 |
Oct 14, 2011 |
| PDF |
Page 137
last paragraph |
U+0OBC is 1⁄4
should be:
U+00BC is 1⁄4
Note from the Author or Editor: Change as noted. It should be all zeroes in that bit of code.
|
chunzi |
Aug 25, 2011 |
Oct 14, 2011 |
| PDF |
Page 142
last paragraph |
the pattern would look like /^(fred(barney)/
should be:
the pattern would look like /\A(fred(barney)/
Note from the Author or Editor: Change as noted
|
chunzi |
Aug 28, 2011 |
Oct 14, 2011 |
| Safari Books Online |
143
1st code snippet |
if (/\s(\[a-zA-Z]+),/) { # capture the word between space and comma
should be (just without backslash before '['):
if (/\s([a-zA-Z]+),/) { # capture the word between space and comma
Note from the Author or Editor: Remove slash in front of square brace.
|
Grzegorz Szpetkowski |
Sep 20, 2011 |
Oct 14, 2011 |
| PDF |
Page 147
at first footnote |
you use \k<label:
should be:
you use \k<label>:
and, the footnote has the same issue:
A \k<label is slightly different
should be:
A \k<label> is slightly different
Note from the Author or Editor: Change as noted
|
chunzi |
Aug 29, 2011 |
Oct 14, 2011 |
| Printed |
Page 151
1st footnote |
The first footnote is incorrect because nothing can come after the \z anchor (including newline). If the corresponding pattern had used \Z (which allows an optional newline after it), then the footnote would have been applicable.
Note from the Author or Editor: Footnote deleted.
|
aphilipp |
Oct 19, 2011 |
Jan 13, 2012 |
| Safari Books Online |
153
1st paragraph |
See “Answers to Exercises” on page 306 for answers to the following exercises.
should be (also with proper hyperlink to page 308 instead of 306):
See “Answers to Exercises” on page 308 for answers to the following exercises.
Note from the Author or Editor: This is the link from the Chapter 8 exercises to the Chapter 7 answers. The link should be from the Chapter 8 exercises to the Chapter 8 answers, on page 308.
|
Grzegorz Szpetkowski |
Sep 26, 2011 |
Oct 14, 2011 |
| Safari Books Online |
153
Exercise 5. |
For example, if the input string says I
saw Wilma yesterday, the up-to-five characters are “yest”.
should be:
For example, if the input string says I saw Wilma yesterday, the up-to-five characters are “ yest”.
Note from the Author or Editor: Fixed in the source. Thanks.
|
Grzegorz Szpetkowski |
Nov 18, 2011 |
Jan 13, 2012 |
| PDF |
Page 192
2nd code example |
Change "Set::Crossproduct" to "Set::CrossProduct".
Note from the Author or Editor: Change as noted
|
aphilipp |
Oct 13, 2012 |
|
| PDF |
Page 192
1st code section, 6th line |
Change "brian" to "fred".
Note from the Author or Editor: Change as noted
|
aphilipp |
Oct 13, 2012 |
|
| Printed |
Page 200
5th code line |
print $dt->ymd(''); # 20010423
should be
print $dt->ymd(''); # 20110423
Note from the Author or Editor: Change as noted. The year should be 2011
|
aphilipp |
Oct 27, 2011 |
Jan 13, 2012 |
| Printed |
Page 200
3rd code line from bottom |
my @units = $duration->in_units( qw(year month day) );
should be
my @units = $duration->in_units( qw(years months days) );
Also, as there is no mention of the "in_units" method in the DateTime module documentation, some discussion regarding the creation of a "DateTime::Duration" object (resulting from the subtraction between $dt2 and $dt1) would have been helpful.
Note from the Author or Editor: Corrected as noted.
|
aphilipp |
Nov 06, 2011 |
Jan 13, 2012 |
| Printed |
Page 221
4th paragraph |
"In Perl, you use the unlink operator with a list of the file that you want to remove"
should be
"In Perl, you use the unlink operator with a list of the files that you want to remove"
|
aphilipp |
Jan 16, 2012 |
|
| PDF |
Page 244
last 3rd paragraph |
So the comparison is $score{"fred"} <=> $score {"barney>"},
should be:
So the comparison is $score{"fred"} <=> $score {"barney"},
Note from the Author or Editor: There's an extra > in that inline code. Remove it.
|
chunzi |
Sep 12, 2011 |
Oct 14, 2011 |
| Printed |
Page 248
3rd paragraph |
"When you finds one that does match"
should be
"When you find one that does match"
It is peculiar that this exact text appears in the previous edition without the typo.
Note from the Author or Editor: Change as noted. Fixed in the repo.
|
aphilipp |
Nov 16, 2011 |
Jan 13, 2012 |
| Printed |
Page 249
code at bottom of page |
The smart match "@nums ~~ $result" gives a false result. Upon further investigation, I noticed that this problem was already discussed in the errata of the 5th edition (see submission for page 290). To summarize, this smart match now only works when the scalar comes before the array (i.e. "$result ~~ @nums").
Note from the Author or Editor: I've removed this example from the sources.
|
aphilipp |
Nov 19, 2011 |
Jan 13, 2012 |
| Printed |
Page 251
4th paragraph |
In the paragraph starting with
"What if you have tow scalar variables? ..."
the scalar variables used in the code are called $fred and $barney. However, in the explanation following the code snippet, they are referred to as $scalar1 and $scalar2.
Note from the Author or Editor: Change $scalar1 and $scalar2 to $fred and $barney as noted. This is in the paragraph immediately before the section heading "The given statement"
|
Varun Vats |
Apr 30, 2012 |
|
| Printed |
Page 251
Last paragraph |
The last sentence of the last paragraph says ( underscores only for emphasis):
"Each when block reports a different way that it found Fred, starting with the _least restrictive to the most_."
Assuming that you are using the second code snippet from the following page (253), and not the first (which does not seem to have any specific order), the sentence should mention "most restrictive to the least" instead.
<aside>
Sorry if this has been already fixed from aphilipp's reports.
</aside>
Note from the Author or Editor: Change to "least restrictive to most" as noted.
|
Varun Vats |
Apr 30, 2012 |
|
| Printed |
Page 252
first 2 code examples |
Example #1:
==========
given ( $ARGV[0] ) {
when ( 'Fred' ) { say 'Name is Fred' }
when ( /fred/i ) { say 'Name has fred in it' }
when ( /\AFred/ ) { say 'Name starts with Fred' }
default { say "I don't see a Fred" }
}
Example #2:
==========
given( $ARGV[0] ) {
when ( $_ ~~ 'Fred' ) { say 'Name is Fred' }
when ( $_ ~~ /\AFred/ ) { say 'Name starts with Fred' }
when ( $_ ~~ /fred/i ) { say 'Name has fred in it' }
default { say "I don't see a Fred" }
}
The second example is supposed to be a rewrite of the first example, with the only difference being the use of explicit smart matching. But looking carefully, one can see that the second and third when conditions are reversed. Because of this, the output from each example can be different (as shown below).
Output for Example #1:
==================
$ perl5.10.1 switch.pl Frederick
Name has fred in it
Output for Example #2:
==================
$ perl5.10.1 switch.pl Frederick
Name starts with Fred
Also, the above example code is used as the basis for further examples throughout the remainder of this chapter. So any corrections to the above mentioned code should probably be applied to the rest of the chapter.
Note from the Author or Editor: Fixed in the sources. Thanks,
|
aphilipp |
Nov 20, 2011 |
Jan 13, 2012 |
| Printed |
Page 253
3rd paragraph |
The following is the example code that corresponds to the text that is at issue:
given ( $ARGV[0] ) {
when ( $_ ~~ 'Fred' ) { say 'Name is Fred'; break }
when ( $_ ~~ /fred/i ) { say 'Name has fred in it'; break }
when ( $_ ~~ /\AFred/ ) { say 'Name starts with Fred'; break }
default { say "I don't see a Fred"; break }
}
The above code does not agree with the text. This example does not go from general to specific. It is untrue that Perl doesn’t test any of the when conditions if the argument matches /fred/i. The when condition "if the argument is exactly Fred" does in fact get checked because it is the second when block that stops the entire control structure.
As this paragraph was borrowed from the 5th edition, I suspect that it was not updated to reflect changes made to the example code. The other possibility is that some of the lines in the example code are not in the correct order (as pointed out in the errata submission for page 252).
Note from the Author or Editor: Fixed in the sources
|
aphilipp |
Nov 21, 2011 |
Jan 13, 2012 |
| Printed |
Page 253
2nd code example |
The "# OOPS!" comment next to the first when block should be deleted.
Note from the Author or Editor: Fixed in the sources
|
aphilipp |
Nov 21, 2011 |
Jan 13, 2012 |
| PDF |
Page 253
1st and 2nd code examples, 1st paragraph |
Code Example #1
==============
given ( $ARGV[0] ) {
when ( $_ ~~ 'Fred' ) { say 'Name is Fred'; break }
when ( $_ ~~ /fred/i ) { say 'Name has fred in it'; break }
when ( $_ ~~ /\AFred/ ) { say 'Name starts with Fred'; break }
default { say "I don't see a Fred"; break }
}
Paragraph #1
===========
This doesn't work very well for the problem, though. Since our example goes from specific to general, if the argument matches Fred, Perl doesn't test any more of the when conditions. I don't get to check if the argument is exactly Fred because the first when block stops the entire control structure.
Code Example #2
==============
given ( $ARGV[0] ) {
when ( $_ ~~ 'Fred' ) { say 'Name is Fred'; continue }
when ( $_ ~~ /fred/i ) { say 'Name has fred in it'; continue }
when ( $_ ~~ /\AFred/ ) { say 'Name starts with Fred'; continue } # OOPS!
default { say "I don't see a Fred" }
}
Discussion
=========
The order of the when conditions in these code examples is not consistent with the other examples in this section. I assume that the order should be as follows:
when ( $_ ~~ 'Fred' )
when ( $_ ~~ /\AFred/ )
when ( $_ ~~ /fred/i )
Paragraph #1 does not seem to be well adapted since the previous edition. Previously, the order went from general to specific. Because of this, it made sense to call attention to the fact that none of the other when conditions are tested if the argument matches /fred/i. But because we are now going from specific to general, it not longer seems meaningful. For example, if the argument matches Fred, then there is no need to test any of the other when conditions since we already know that they would match.
Also, the last sentence in the paragraph #1 is no longer applicable and should probably be removed.
Note from the Author or Editor: That's probably a good idea
|
aphilipp |
Jan 25, 2012 |
|
| PDF, Other Digital Version |
Page 255
2nd paragraph |
Actually is:
when ( ! /\A-?\d+\.\d+\z/ ) { #smart
Should be:
when ( ! /\A-?\d+\.\d+\z/ ) { #dumb
Since "Negated expressions, including a negated regular expression, don’t use a smart match either." (top of Page 256)
Note from the Author or Editor: Change as noted
|
Anonymous |
Jul 24, 2011 |
Oct 14, 2011 |
| PDF |
Page 256
all 3 code examples |
The main logic in the code examples is as follows:
foreach ( @names ) {
when ( /fred/i ) { say 'Name has fred in it'; continue }
when ( /\AFred/ ) { say 'Name starts with Fred'; continue }
when ( 'Fred' ) { say 'Name is Fred'; }
default { say "I don't see a Fred" }
}
It logically makes more sense to reverse the order of the when conditions. By putting the general when condition at the bottom, we ensure that the default does not get invoked when any of the when conditions are true. This can be illustrated as follows:
foreach ( @names ) {
when ( 'Fred' ) { say 'Name is Fred'; continue }
when ( /\AFred/ ) { say 'Name starts with Fred'; continue }
when ( /fred/i ) { say 'Name has fred in it'; }
default { say "I don't see a Fred" }
}
Also, the above change would make the logic consistent with the other examples in the chapter.
Note from the Author or Editor: That's probably a good idea.
|
aphilipp |
Jan 26, 2012 |
|
| Printed |
Page 283
3rd code snippet |
The statement
my $barney = eval { $fred / $dino }
is missing a semicolon ( ; ) at the end.
Note from the Author or Editor: Change as noted
|
Varun Vats |
May 16, 2012 |
|
| Printed |
Page 286
4th paragraph |
"If the keyword eval doesn't come directly before a block of code in curly braces, as you saw for most of this section, there's no need to worry - that's the safe kind of eval."
should be
"If the keyword eval comes directly before a block of code in curly braces, as you saw for most of this section, there's no need to worry - that's the safe kind of eval."
Note from the Author or Editor: Fixed in the source
|
aphilipp |
Dec 02, 2011 |
Jan 13, 2012 |
| Printed |
Page 288
Last paragraph |
In the code snippet following the last paragraph, the autodie pragma should be used to make the open statement die on error.
Also, the open statement should be enclosed in an eval block (as given in the autodie documentation) to be able to have a meaningful execution of the given-when block. If it is not, $@ will be an empty string and the default case will be executed even on an error.
Note from the Author or Editor: The last line of code on p288 should change to:
use autodie;
eval { open my $fh, '>', $filename; # still dies on error };
|
Varun Vats |
May 17, 2012 |
|
| Printed |
Page 292
last code example |
use List::MoreUtils qw(none any all);
if (none { $_ > 100 } @numbers) {
print "No elements over 100\n"
} elsif (any { $_ > 50 } @numbers) {
print "Some elements over 50\n";
} elsif (all { $_ < 10 } @numbers) {
print "All elements are less than 10\n";
}
In this example, we can never drop down to the last conditional expression. Success is always achieved in one of the first 2 conditional expressions. Perhaps the code can be modified so that all of the conditional expressions have a chance for success.
Note from the Author or Editor: Good catch! Fixed in the source so that all three branches might execute.
|
aphilipp |
Dec 03, 2011 |
Jan 13, 2012 |
| PDF |
Page 293
3rd paragraph |
It then goes back to @family
should be:
It then goes back to @abc
Note from the Author or Editor: Change as noted
|
chunzi |
Sep 19, 2011 |
Oct 14, 2011 |
| PDF |
Page 293
3rd noncode paragraph |
"It then goes back to @family to get its next element,..." should read "It then goes back to @abc to get its next element,..."
Note from the Author or Editor: The printed book has this mistake, but my sources don't. That's odd. It's correct in the current sources.
|
Ben Altman |
Dec 04, 2011 |
Jan 13, 2012 |
| Printed |
Page 293
between 3rd and 4th paragraphs |
Some of the elements of @large_array contain the undef value. Therefore the following change should be made:
a 1 dino b 2 c 3 ...
should be
a 1 dino b 2 undef c 3 ...
Note from the Author or Editor: There should have been two spaces after the 2. I've also added a short paragraph after that output to explain it.
|
aphilipp |
Dec 04, 2011 |
Jan 13, 2012 |
| Safari Books Online |
295
First exercise |
$ perl -e 'print "Hello, World\n"'
Since this doesn't work for Windows folks, you could add another footnote for them. Here is SO question, which covers that topic greatly:
http://stackoverflow.com/questions/4352026/why-doesnt-this-perl-one-liner-work-on-windows
Note from the Author or Editor: There's not much we can do in Chapter 1 because we haven't shown them anything that can fix this. We can add a footnote though.
|
Grzegorz Szpetkowski |
Oct 22, 2011 |
|
| Printed |
Page 310
2nd paragraph |
In the solution to Chapter 9 Exercise 2, the text refers to bareword filehandles IN and OUT. But the corresponding code uses scalar variables $in_fh and $out_fh to store the filehandles. The text should correlate with the code.
Note from the Author or Editor: Fixed in the source.
|
aphilipp |
Oct 22, 2011 |
Jan 13, 2012 |
| PDF |
Page 310
2nd paragraph |
"Once the filehandles $in and $out are opened, the real program can begin."
should be
"Once the filehandles $in_fh and $out_fh are opened, the real program can begin."
Note from the Author or Editor: Fixed in the sources
|
aphilipp |
Jan 24, 2012 |
|
| Printed |
Page 313
code for Chapter 11 Exercise 1 |
Exercise 1 on page 201 asks to print a list of all of the modules that came with Perl 5.14. Therefore the following change should be made to the solution on page 313.
my %modules = %{ $Module::CoreList::version{5.006} };
should be
my %modules = %{ $Module::CoreList::version{5.014} };
Note from the Author or Editor: Fixed in repo as noted.
|
aphilipp |
Nov 01, 2011 |
Jan 13, 2012 |
| Printed |
Page 313
code for Chapter 11 Exercise 2 |
In the first solution to Exercise 2, the localtime function was meant to be called in list context, with the resulting list being stored in an array. Therefore $t should be changed to @t, as shown below.
use DateTime;
my $t = localtime;
my $now = DateTime->new(
year => $t[5] + 1900,
month => $t[4] + 1,
day => $t[3],
);
should be
use DateTime;
my @t = localtime;
my $now = DateTime->new(
year => $t[5] + 1900,
month => $t[4] + 1,
day => $t[3],
);
Note from the Author or Editor: Fixed in sources as described
|
aphilipp |
Nov 02, 2011 |
Jan 13, 2012 |
| Printed |
Page 317, 318
code for Chapter 13 Exercises 2 & 3 |
To be consistent with Exercise 1, the following change should be made to the code in Exercises 2 and 3:
if ($dir =~ /\A\s*\Z/) { # A blank line
chdir or die "Can't chdir to your home directory:
$!";
}
should be
if ($dir =~ /\A\s*\Z/) { # A blank line
chdir or die "Can't chdir to your home directory: $!";
}
Note from the Author or Editor: It looks like some bad wrapping in exercises 2 and 3. Thanks,
|
aphilipp |
Nov 16, 2011 |
Jan 13, 2012 |
| Printed |
Page 323-327
first line of each solution |
Page 247 explains that smart matching is broken in Perl 5.10.0 and that most of the problems disappeared in Perl 5.10.1. To be consistent with the examples presented in Chapter 15, the following change should be made to the exercise solutions:
use 5.010;
should be
use 5.010001;
Note from the Author or Editor: Fixed in sources.
|
aphilipp |
Nov 24, 2011 |
Jan 13, 2012 |
| Printed |
Page 328
5th code line in Chapter 16 Exercise 4 |
sub my_usr2_handler { say 'Caught INT. Exiting.'; exit }
should be
sub my_int_handler { say 'Caught INT. Exiting.'; exit }
Note from the Author or Editor: Fixed in the sources, thanks.
|
aphilipp |
Nov 28, 2011 |
Jan 13, 2012 |
| Printed |
Page 328
code for Chapter 17 Exercise 1 |
chomp(my @strings = <FILE>);
should be
chomp(my @strings = <$fh>);
Note from the Author or Editor: Fixed in the sources.
|
aphilipp |
Dec 07, 2011 |
Jan 13, 2012 |
| Printed |
Page 330
6th paragraph |
"has a strftime subroutine the takes"
should be
"has a strftime subroutine that takes"
|
aphilipp |
Dec 09, 2011 |
Jan 13, 2012 |
| Safari Books Online |
345
2nd paragraph from bottom |
"That way, treating your
ASCII or Latin-1 strings as UTF-8 should work out just fine (but not UTF-16, where
every character takes up at least two bytes)."
UTF-8 encoding uses two bytes for Latin-1 characters (excluding ASCII subset), e.g. COPYRIGHT SIGN (U+00A9) is encoded as C2 A9 (UTF-8), whereas Latin-1 stores it as single byte A9, so binary representation is diffrent (UTF-8 encodes as one byte only these code points from U+0000 to U+007F).
Note from the Author or Editor: Remove "or Latin-1" from that sentence. Although Latin-1 and Unicode share the same code numbers, the encoding isn't the same in UTF-8.
|
Grzegorz Szpetkowski |
Sep 03, 2011 |
Oct 14, 2011 |
| Printed |
Page 346
4th paragraph |
Two subroutines for decomposition supplied by Unicode::Normalize are mentioned. They are NFD and NFKD. While NFD has a description of what it does, NFKD does not. Below are two sentences from the text, where the second one seems to be incomplete:
"You use the NFD subroutine (Normalization Form Decomposition), which turns canonically equivalent forms into the same decomposed form."
"You use the NFKD subroutine (Normalization Form Kompatibility Decomposition)."
Shouldn't this second sentence also include a brief description of what NFKD does?
Note from the Author or Editor: Corrected in the source.
|
aphilipp |
Dec 10, 2011 |
Jan 13, 2012 |
| Printed |
Page 346
4th paragraph |
"while the "yay" message should"
should be
"while the "yay" messages should"
|
aphilipp |
Dec 24, 2011 |
Jan 13, 2012 |
| PDF, Other Digital Version |
Page 347
Figure C-2 |
In the right part of the image it says
SMALL LETTER A, U+00E4
It should be
SMALL LETTER A, U+0061
Note from the Author or Editor: Change as noted
|
Johan Andersson von Geijer |
Jun 25, 2011 |
Oct 14, 2011 |
| Safari Books Online |
347
Figure C-2 |
"DIAERESIS, U+00A8"
should be (because of NFD transformation):
"COMBINING DIAERESIS, U+0308"
Note from the Author or Editor: Change as noted
|
Grzegorz Szpetkowski |
Sep 03, 2011 |
Oct 14, 2011 |
| PDF, Other Digital Version |
Page 348
1rst paragraph, 2nd sentence. |
Actually is:
The NFKD forms miss the compatible equivalents:
Should be:
The NFD forms miss the compatible equivalents:
Note from the Author or Editor: Change as noted
|
Johan Andersson von Geijer |
Jun 25, 2011 |
Oct 14, 2011 |
| PDF |
Page 349
second title |
Reading from or Writing to STDOUT or STDERR
should be:
Reading from STDIN or Writing to STDOUT or STDERR
Note from the Author or Editor: Change as noted
|
chunzi |
Sep 22, 2011 |
Oct 14, 2011 |
| PDF |
Page 353
2nd and 3rd entries in the index |
Two index entries for the /a and /r modifiers are the wrong location. They should be placed with the other modifiers. The index should look as follows:
/a modifier, 129, 136
/g modifier, 156
/i modifier, 134
/l modifier, 136
/r modifier, 158
/s modifier, 134
/u modifier, 136
/x modifier, 135
Note from the Author or Editor: Change as noted
|
aphilipp |
Jan 24, 2012 |
|
| PDF |
Page 354
index below A |
/a modifier, 136
should be
/a modifier, 129, 136
Note from the Author or Editor: The /a modifier index entry should be modified as noted.
|
aphilipp |
Apr 25, 2012 |
|
| Printed |
Page 361
index |
The following should be added to the index:
readlink function, 228
Note from the Author or Editor: Change as noted
|
aphilipp |
Jan 19, 2012 |
|
| PDF |
Page 361
index below R |
The following should be added to the index:
/r modifier, 158
Note from the Author or Editor: There should be an index entry for /r, as noted
|
aphilipp |
Apr 25, 2012 |
|
| PDF |
Page 365
first paragraph |
Fifth Edition
should be:
Sixth Edition
Note from the Author or Editor: Change as noted
|
chunzi |
Sep 22, 2011 |
Jan 13, 2012 |
| Printed, Safari Books Online |
Page 365
3rd paragraph |
"He was been an instructor and author"
should be
"He was an instructor and author"
Note from the Author or Editor: In the "About the author" for brian, change "He was been" to "He was", as noted.
|
mward333 |
Apr 20, 2012 |
|
|