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 vii
-1

a link to the brain tumors you suspect exist.
->
a role in tumor development.

########################################

Anonymous 
Printed Page ix
-2

metaphor between the two disciplines.)
->
metaphor.)

########################################

Anonymous 
Printed Page xi
+2

sequences data
->
sequence data

########################################

Anonymous 
Printed Page vii
-1 ## A reader reports

Genbank
->
GenBank

## This is confirmed.

########################################

Anonymous  Jan 2007
Printed Page viii
+1 ## A reader reports

Genbank
->
GenBank

## This is confirmed.

########################################

Anonymous  Jan 2007
Printed Page ix
+2


itself or an adjunct to ongoing investigations.
->
itself, or as an adjunct to ongoing investigations.

########################################

Anonymous  Jan 2007
Printed Page ix
+3

This books is
->
This book is

########################################

Anonymous  Jan 2007
Printed Page ix
-2

and the computer program.
->
and computer programming.

########################################

Anonymous  Jan 2007
Printed Page 1
+3

large, programmable, digital/electronic (the ENIAC) computers.
->
large-scale, programmable, digital, electronic computers (such as ENIAC).

########################################

Anonymous 
Printed Page 2
+4

The bases joined end to end to form
->
The bases are joined end to end to form

########################################

Anonymous 
Printed Page 2
-3

it's done so left to right
->
it's usually written left to right

########################################

Anonymous 
Printed Page 2
+3

of DNA and positions

NOW READS:
of DNA and proteins

Anonymous  Sep 2004
Printed Page 2
-3

as in translating it to RNA

NOW READS:
as in transcribing it to RNA

Anonymous  Sep 2004
Printed Page 3
footnote

It can appear as
->
It can appear in

########################################

Anonymous 
Printed Page 3
footnote

most of the life
->
much of the life

########################################

Anonymous 
Printed Page 3
+3

Genbank, the Genetic Sequence Data Bank (http://www.ncbi.n/m.nih.gov)

NOW READS:
GenBank, the Genetic Sequence Data Bank (http://www.ncbi.nlm.nih.gov)

Anonymous  Sep 2004
Printed Page 3
-2

are composed of an amino group and a carboxyl group.

NOW READS:
are composed of an amino group, a carboxyl group, and a sidechain.

Anonymous  Sep 2004
Printed Page 4
+2

easy to identify
->
easy to calculate the

########################################

Anonymous 
Printed Page 4
+5

such as the intriguing processes of
->
for instance, the intriguing techniques of

########################################

Anonymous 
Printed Page 5
+2

related by virtue of their protein products as part of
->
related by virtue of their protein products being part of

########################################

Anonymous 
Printed Page 7
-4

natural, or spoken, languages, such as English
->
<emphasis>natural languages</emphasis>, such as English

##(NOTE to editors): natural language is not synonomous with spoken language.
## You can speak mathematics, or music, or Perl. You can write English.
## Some natural languages are now only written, such as ancient Egyptian, etc.
## A fine point, I realize, but humor me -- I spent 6 years in speech research,
## and my opinions are ossified ;>). So I <emphasize> it as a technical term, and
## give an immediate example - English.

########################################

Anonymous 
Printed Page 9
+1

Mac, then
->
Mac, and then

########################################

Anonymous 
Printed Page 9
-2

MacOS X
->
Mac OS X

########################################

Anonymous 
Printed Page 10
-2

MacOS X
->
Mac OS X

## two instances of this here

########################################

Anonymous 
Printed Page 11
+1 ## A reader reports

several books such as O'Reilly's Perl Resource Kits,
->
several books

## The reader comments:
## I would suggest to remove "such as O'Reilly's Perl Resource Kits,".
## There is only the Win32 version still available, and even this version
## is totally outdated and much too expensive for the audience of this book.

## Tisdall says: sounds plausible to me: editors, how say you??

########################################

Anonymous 
Printed Page 11
itemized list #1

the that
->
that the

########################################

Anonymous 
Printed Page 14
-3

type /my_program

NOW READS:
type ./my_program

Anonymous  Sep 2004
Printed Page 15
+1

MacOS X
->
Mac OS X

########################################

Anonymous 
Printed Page 16
-1

beginners, there's
->
beginners: there's

########################################

Anonymous 
Printed Page 30
+1

structure
->
primary structure

########################################

Anonymous 
Printed Page 30
+2

add a sugar and you get the nucleotides
->
add a sugar and you get the nucleosides

########################################

Anonymous 
Printed Page 30
+2

the words "bases", "nucleosides" (see preceding note), and
"nucleotides" should be in italics - these are
important terms

########################################

Anonymous 
Printed Page 32
+1

remember that
->
remember

########################################

Anonymous 
Printed Page 33
+2 command example ## A reader reports

perl example4 -1
->
perl example4-1

## This is confirmed.

########################################

Anonymous 
Printed Page 34
+2

MacOS X
->
Mac OS X

########################################

Anonymous 
Printed Page 35
+2

more easily read
->
more easily readable

########################################

Anonymous 
Printed Page 38
+3

and to make sure
->
and its output to make sure that

########################################

Anonymous 
Printed Page 38
-1

to the right
->
on the right

########################################

Anonymous 
Printed Page 42
Figure 4-1

The text "delimiters to separate the parts of the operator"
only point to two of the three delimiters, missing the
middle delimiter. As drawn, it might be confused as
representing the entire "/T/U/" instead of just the
three forward slashes "/".

The text "variable" is drawn to encompass "RNA",
omitting the "$". It should encompass the
entire "$RNA".

The text "Other common options" should
read "Other common modifiers"

########################################

Anonymous 
Printed Page 45
-2

new and successful way.
->
new and successful approach.

########################################

Anonymous 
Printed Page 47
+4

You can use any name
->
You can use any name for the file

########################################

Anonymous 
Printed Page 52
+2

You can print the elements one a after
->
You can print the elements one after

########################################

Anonymous 
Printed Page 54
+1

both are listed in
->
both are demonstrated in

########################################

Anonymous 
Printed Page 55
Exercise 4.7

the last line first. Or you may
->
the last line first. You may

########################################

Anonymous 
Printed Page 60
-1

Example 5-2 (from Chapter 4)
->
Example 5-2 (which modifies Example 4-7)

########################################

Anonymous 
Printed Page 61
-3

is assigned each time through the loop to
the next line of the file
->
is assigned to the next line of the file
each time through the loop

########################################

Anonymous 
Printed Page 61
-2

a Microsoft Windows versions
->
a version of Microsoft Windows

########################################

Anonymous 
Printed Page 62
+4

the type of input it gets.
->
the type of input the program gets.

########################################

Anonymous 
Printed Page 63
+2 ## A reader reports

Formats A nd B
->
Formats A and B

## This is confirmed.

########################################

Anonymous 
Printed Page 64
+1

Example 5-3, in Chapter 9, and
->
Example 5-3; in Chapter 9; and

########################################

Anonymous 
Printed Page 66
-3 ## A reader reports

is a scalar variable starts with a dollar sign $)
->
is a scalar variable (which starts with a dollar sign $)

## This is confirmed.

########################################

Anonymous 
Printed Page 66
+2

(as was true in Example 4-3)

NOW READS:
(as was true in Example 4-5)

Anonymous  Sep 2004
Printed Page 68
-3

whitespace characters, represented by s with nothing and by the lack of anything between
the second and third forward slashes.
->
whitespace characters (represented by s) with nothing (represented by the lack of anything between
the second and third forward slashes).

########################################

Anonymous 
Printed Page 68
-3

characters, which is done globally
->
characters. This deletion is done globally

########################################

Anonymous 
Printed Page 69
+1 ## A reader reports

line, and a formfeed advances to the next line. The two of them
together amount to the same thing as a newline character.
->
line. Perl newlines are handled differently on different operating systems;
briefly,
works on all, but you may see
at the end of lines on Windows.

## This is confirmed.

########################################

Anonymous 
Printed Page 72
-1

We now have a design for the program, let's
->
Now that we have a design for the program, let's

########################################

Anonymous 
Printed Page 74
-3

is the same as previous
->
is the same as in previous

########################################

Anonymous 
Printed Page 74
Output from Example 5-4

T = 17

NOW READS:
T = 17
errors = 1

Anonymous  Sep 2004
Printed Page 75
+2

decimal or floating-point numbers
->
decimal (or floating-point) numbers
## italicise "floating-point"

########################################

Anonymous 
Printed Page 75
+2

6,544000
->
6544000

## not 6,544,000 because readers might try inputting numbers to Perl that way

########################################

Anonymous 
Printed Page 75
+4 ## A reader reports

(see Chapter 6 and the discussion of my variables)
->
## omit this parenthesis, it duplicates a remark earlier in the paragraph.

## This is confirmed.

########################################

Anonymous 
Printed Page 75
+4

languages also require you to declare the type of a variable, for example "integer," or
"string," but Perl does not.
->
languages require you to pre-declare a variable's type (e.g. "integer i"). Perl
indicates the type right in the variable name (e.g. the "@" in "@array").

########################################

Anonymous 
Printed Page 77
+2

This version of the foreach loop:

foreach(@DNA) {.

NOW READS:
This version of the foreach loop:

foreach (@DNA) {

Anonymous  Sep 2004
Printed Page 77
+2

in the version of this loop in Example 5-5

NOW READS:
in the version of this loop in Example 5-4

Anonymous  Sep 2004
Printed Page 80
+2

or Perl documentation
->
or the Perl documentation

########################################

Anonymous 
Printed Page 80
+1 (output of Example 5-6)

recognize this vase:

NOW READS:
recognize this base:

Anonymous  Sep 2004
Printed Page 81
-1

regularly
->
often

########################################

Anonymous 
Printed Page 81
+5

"seeing.
"

NOW READS:
"seeing".

Anonymous  Sep 2004
Printed Page 82
footnote

reading from, and writing to, files as well as other actions.
->
reading from files and writing to files, as well as other actions.

########################################

Anonymous 
Printed Page 82
+1 (in code fragment)

# Also write the results to a file called "countbase"

$outputfile = "countbase";
(
unless ( open(COUNTBASE, ">$outputfile") ) {

NOW READS:
# Also write the results to a file called "countbase"
$outputfile = "countbase";

unless ( open(COUNTBASE, ">$outputfile") ) {

Anonymous  Sep 2004
Printed Page 82
footnote

several other behaviors.

NOW READS:
several other behaviors, such as appending to a file.

Anonymous  Sep 2004
Printed Page 84
Second line from top

while($dna =~ /a/ig){$a++}
Should be:
while($DNA =~ /a/ig){$a++}

4th line from top;
$dna =~ /a/ig
should be:
$DNA =~ /a/ig

########################################

Anonymous 
Printed Page 84
+2

also has the global modifier,
->
also has the global modifier g,

########################################

Anonymous 
Printed Page 84
-3

you'll use those while loops to good effect
->
you'll use while loops in a similar fashion, to good effect

########################################

Anonymous 
Printed Page 84
-1

The program, however,
->
The program, moreover,

########################################

Anonymous 
Printed Page 84
last code

($dna = ~ tr/ACGTacgt//)
->
($dna =~ tr/ACGTacgt//)
There shouldn't be a space between = and ~

########################################

Anonymous 
Printed Page 85
Exercise 5-1

MacOS X
->
Mac OS X

########################################

Anonymous 
Printed Page 85
Exercise 5.6; ## A reader reports

The solution to Exercise 5.6 does not find the reverse complement of DNA. If s
hift is substituted for pop in the code, then the reverse complement would be f
ound.

However the solution to Exercise 5.6 does not show any output when compiled. P
lease fix the solution to Exercise 5.6, ie include STDIN in the program.

## Tisdall replies:
## This report is incorrect. The exercise determines if the two input
## strings are reverse complements of each other.
## Also, the program does not use STDIN -- it gets its data from the
## command line, and uses @ARGV for that. Here's an example of running
## the program:
#### $ perl exer05.06 ACCGGTAGCGGAGCTGGG CCCAGCTCCGCTACCGGT
#### They ARE reverse complements

########################################

Anonymous 
Printed Page 85
-1 ## A reader reports

(eq actually an operator).
->
(eq is actually an operator).

## This is confirmed.

########################################

Anonymous 
Printed Page 86
Exercise 5.9 ## A reader reports

(Hint: you can use the Perl functions substr or slice.
->
(Hint: you can use the Perl functions substr or splice.)

## This is confirmed

########################################

Anonymous 
Printed Page 86
Exercise 5.10; ## A reader reports

After being compiled and run Exercise 5.10 does not, print the message:

"File $tmpfile does not exists!
"

Shouldn't the program print this, since the program's purpose is to remove the
tmp file?

## Tisdall replies:
## This report is incorrect. The program does not print any message when
## everything works. Error messages are only printed if something fails
## to work during the program. (Think of it as an error-reporting program.)

########################################

Anonymous 
Printed Page 87
+1

the mutation of DNA.
->
the mutation of DNA, and in all the following chapters.

########################################

Anonymous 
Printed Page 88
+1

mean of a distribution at
->
mean of a distribution, at

########################################

Anonymous 
Printed Page 88
footnote

so-called recursion
->
## italicise "recursion"

########################################

Anonymous 
Printed Page 88
-3

The trick of all
->
The trick to all

########################################

Anonymous 
Printed Page 89
-2

We'll now look at this code
->
We'll now look more closely at this code

########################################

Anonymous 
Printed Page 90
-1

seen earlier in loops and conditional statements that groups
->
as the block used in a loop to group

########################################

Anonymous 
Printed Page 91
-3

as in return $dna; in our subroutine addACGT, in a list of scalars as in
return ($dna1, $dna2);, in an array as in return @lines;, and more.
->
as in return $dna in our subroutine addACGT; in a list of scalars as in
return ($dna1, $dna2); in an array as in return @lines; and more.

########################################

Anonymous 
Printed Page 93
+3 code example

my $x ;
->
my $x;

########################################

Anonymous 
Printed Page 93
warning

such as the my construct.

NOW READS:
with the my construct. (Unless you're
using global variables, which we're not.)

Anonymous  Sep 2004
Printed Page 94
-1

You can get by this
->
You can obtain the

########################################

Anonymous 
Printed Page 96
+1

even though a variable called $dna is lengthened inside the subroutine
->
even though the value of a variable called $dna is altered inside the subroutine

########################################

Anonymous 
Printed Page 96
+2

You use the command line
->
You'll also use the command line

########################################

Anonymous 
Printed Page 96
-2

MacOS X
->
Mac OS X

########################################

Anonymous 
Printed Page 96
+4 code fragment

AAGGGGTTTCCC

NOW READS:
% perl example6-3.pl AAGGGGTTTCCC

Anonymous  Sep 2004
Printed Page 97
Subroutines for Example 6-3

# Chapter Four, "Motifs and Loops"
->
# Chapter Five, "Motifs and Loops"

########################################

Anonymous 
Printed Page 98
-4

as you would any other scalar variables.
->
as you would any other scalar variable.

########################################

Anonymous 
Printed Page 101
+3

In the example of pass-by-reference in this section
->
In the example of pass-by-reference later in this section

########################################

Anonymous 
Printed Page 102
-2

passed on as arguments.
->
passed in as arguments.

########################################

Anonymous 
Printed Page 102
-1

appear in multiple program.
->
appear in multiple programs.

########################################

Anonymous 
Printed Page 103
-2

Beginning in Chapter 8, I'll define subroutines and show the code, but you'll be
putting them into your module and typing:
->
All the useful subroutines in this book will be put into this module, which
you'll start using in Chapter 8 by typing:

########################################

Anonymous 
Printed Page 107
code example, for each loop, variable name in line 8 of the

loop, middle of the page

$recieving
->
$receiving

#######################################

Anonymous  Jan 2007
Printed Page 109
-2

step you through that code as well.
->
steps you through that code as well.

########################################

Anonymous 
Printed Page 110
+4

Now that $dna has been declared and initialized, the program seems wrong on the
first statement:
->
Now that $dna has been declared and initialized, let's see if it's what we expect:
this may be where the program's going wrong, on the first statement!

Anonymous 
Printed Page 110
First code section

The paragraph before the code:
"If you wish to see more lines, the w or "window" command will serve"
w adds a watch. It Should be v
"If you wish to see more lines, the v or "window" command will serve"

#######################################

Anonymous 
Printed Page 113
First code part

Books states:

DB<12> D
Deleting all breakpoints..

But it should be:
DB<21> B *
Deleting all breakpoints...

#######################################

Anonymous 
Printed Page 113
Third debugging code section

DB<13> w 45

Should it be
DB<13> v 45

######################################

Anonymous 
Printed Page 113
Second debugging code section

Book states
DB<12> W $receivingcommittment

But should be w (lowercase)
DB<12> w $receivingcommittment

#######################################

Anonymous 
Printed Page 114
2nd paragraph

Book
You see that at line 66 you misspelled

Should be
You see that at line 46 you misspelled

#######################################

Anonymous 
Printed Page 115
Last paragraph from bottom

Book states
"So fix the misspelling at line 66"

Should be
"So fix the misspelling at line 46"

#######################################

Anonymous 
Printed Page 118
+1

nonviable offspring that dies
->
nonviable offspring that die

########################################

Anonymous 
Printed Page 118
+1

they can lead to evolutionary
->
mutations can lead to evolutionary

########################################

Anonymous 
Printed Page 119
last paragraph

the first and last sentences of this paragraph are redundant and one could be cut (I
would recommend cutting the last sentence).

first sentenct: "In the examples that follow, I use a simple Perl Method for seed
picking that's okay for most purposes."

last sentence: "In this book, I use a Perl method that is good enough for most
purposes."

######################################

Anonymous 
Printed Page 123
+2

is a do-until loop.
->
is a do-until loop, first seen in Example 5-3.

########################################

Anonymous 
Printed Page 123
+2

that do the test first and then the block.
->
that test first and then do the block.

########################################

Anonymous 
Printed Page 124
+4

greater than 0 and less than 7

NOW READS:
greater than or equal to 0 and less than 7

Anonymous  Sep 2004
Printed Page 125
-2

a task. the following
->
a task. The following

########################################

Anonymous 
Printed Page 127
+1

is really a short function
->
is a very short subroutine

########################################

Anonymous 
Printed Page 127
+1

It's just like the idea in
->
It's a subroutine to select a string position, very similar to the idea in

########################################

Anonymous 
Printed Page 127
+2

Of course, if you were really writing this code, you'd make a little test to see if your
subroutine worked.
->
While writing subroutines, you frequently want to write a little test to see if your
subroutine works as you intend:

########################################

Anonymous 
Printed Page 129
-3

is a short program.
->
is a short subroutine.

########################################

Anonymous 
Printed Page 129
-3

picking a random position then
->
picking a random position, then

########################################

Anonymous 
Printed Page 129
-3

have to do that a lot
->
have to look things up a lot

########################################

Anonymous 
Printed Page 138
+3

main program and proceeds, following the order of the
top-down design you did in pseudocode,
then followed by the subroutines.
->
main program and is followed by the subroutines,
in the same order as the top-down design you did in pseudocode.

########################################

Anonymous 
Printed Page 142
+2

nucleotide in the same position
->
nucleotides in the same positions

########################################

Anonymous 
Printed Page 146
output example 7-4

is says
matching positions is 0.24%
should say either 24%

#######################################

Anonymous 
Printed Page 147
3rd paragraph from the top

(indexed by $K)

should be
(indexed by $k)

########################################

Anonymous 
Printed Page 148
Exercise 7.7; ## A reader reports

Sometimes not all choices are will be picked
->
Sometimes not all choices are equally likely to be picked

## This is confirmed.

########################################

Anonymous 
Printed Page 149
+2

different data structures (hashes, arrays, and databases) can store

NOW READS:
different data structures (like hashes and arrays) and database systems can store

Anonymous  Sep 2004
Printed Page 150
-5

Mathematically, a Perl hash always represents a finite function.
->
## Take this sentence out of this paragraph, and place it instead
## between the two sentences of the following paragraph.

########################################

Anonymous 
Printed Page 152
+1

couldn't respond
->
couldn't respond informatively

########################################

Anonymous 
Printed Page 152
+2

## Append this at the end of the 2nd paragraph,
## after "missing from your experiment."
->
(Maybe the user simply mistyped the gene name!)

########################################

Anonymous 
Printed Page 152
-1

You might try storing
->
You could store

########################################

Anonymous 
Printed Page 153
+2

in an array, for example, to search
->
in an array. For example, to search

########################################

Anonymous 
Printed Page 155
+1 ## A reader reports

databases. Some good ones that are free
->
databases, some good ones that are free

## This is confirmed.

########################################

Anonymous 
Printed Page 155
-3

The genetic code is how a cell translates the information contained in its DNA into
amino acids and then proteins, which do the real work in the cell.
->
The genetic code describes how the information in the <firstterm>coding regions</firstterm>
of DNA is translated into the correct amino acids for the assembly of the cell's proteins.

########################################

Anonymous 
Printed Page 155
-2

Herein
->
Here

########################################

Anonymous 
Printed Page 156
-2

the process stops when a codon is encountered.
->
the process stops when one of the three stop codons is encountered.

########################################

Anonymous 
Printed Page 156
-1

the encoding of amino acids
->
the encoding for amino acids

########################################

Anonymous 
Printed Page 156
+4

The chart in Figure 8-1 shows how the various bases combine to form amino acids.

NOW READS:
Figure 8-1 shows each codon and its associated amino acid: the genetic code.

Anonymous  Sep 2004
Printed Page 156
-2

the process stops when a codon is encountered.

NOW READS:
the process stops when one of the three stop codons is encountered.

Anonymous  Sep 2004
Printed Page 159
+2

The print statement accepts a filehandle as an optional
argument, but so far, we've been printing to the default STDOUT.
->
The print statement accepts a filehandle as an optional
argument (as in Example 5-7), but by default prints to STDOUT.

########################################

Anonymous 
Printed Page 159
-1

code, and the last subroutine clearly displays this redundancy.
It might be interesting to express that in your subroutine.
->
code, and subroutine codon2aa clearly maps several codons to the
same amino acid. We can represent this redundancy another way.

########################################

Anonymous 
Printed Page 159
-1

let's try to redo the subroutine
->
let's rewrite subroutine codon2aa

######################################

Anonymous 
Printed Page 160
+3 ## A reader reports

$codon
->
## could be formatted in nonproportional font

## Tisdall says: editors, how say you???

#######################################

Anonymous 
Printed Page 163
+4

the genetic code hash
->
the genetic_code hash

########################################

Anonymous 
Printed Page 163
-1

subroutine translates a whole DNA sequence
->
subroutine can be used to translate a whole DNA sequence

########################################

Anonymous 
Printed Page 164
+2 ## A reader reports

condon2aa
->
codon2aa

## This is confirmed.

###########################################

Anonymous 
Printed Page 165
after second paragraph; ## A reader reports

"$codon = substr ($dna, $i 3);" should be
"$codon = substr ($dna, $i, 3);"

## This is confirmed.

########################################

Anonymous 
Printed Page 166
-1

biologists and programmers invented
->
biologists and programmers have invented

########################################

Anonymous 
Printed Page 167
7th paragraph

Protein Identification Resource (PIR)
->
Protein Information Resource (PIR)

#######################################

Anonymous 
Printed Page 167
-1

limit them to 80 characters in length.
->
limit them to at most 80 characters.

########################################

Anonymous 
Printed Page 170
+2

would think incorrectly, that the file
->
would think, incorrectly, that the file

########################################

Anonymous 
Printed Page 171
-1

It's convenient to declare these my variables as $line on the spot,

NOW READS:
It's often convenient to declare a loop's "index variable" (like $line)
as a my variable, right on the spot in the loop,

Anonymous  Sep 2004
Printed Page 174
-1

As you accumulate useful subroutines in our modules,
->
As you accumulate useful subroutines in modules,

########################################

Anonymous 
Printed Page 175
-3

where in the DNA you're studying the cell
->
where, in the DNA you're studying, the cell

#########################################

Anonymous 
Printed Page 176
Code for subroutine "revcom"

my($revcom) = reverse($dna);

NOW READS:
my $revcom = reverse $dna;

Anonymous  Sep 2004
Printed Page 177
-1

## The equation should be reformatted so that:

+1
->
+ 1

#######################################

Anonymous 
Printed Page 177
-1 ## A reader reports

Pseudocode line near the bottom of the page, above last paragraph;
This is pseudocode, so it doesn't have to be perfect, but as written this line
looks like some kind of strange assignment instead of a comparison:

"(end - 1) - (start - 1) + 1 = end - start +1"

I'm not sure what the best way to fix this is. It is set in the monospace font
used for pseudocode & real code, but it isn't quite either, so I was going to s
uggest re-setting it in the variable width font used in the main text. That pro
bably won't clarify it either though, so the equals sign should probably just b
e doubled so that it's clear that the line is a comparison, and not an assignme
nt.

## Tisdall replies:
## This report is (kind of) confirmed. The line in question is an
## equation from elementary algebra.
## = as assignment in programming languages, and = as equality
## in algebra and much other mathematics, is indeed confusing
## (and has already been discussed), therefore let me add:

So let's write this subroutine:
->
as we know from algebra. So let's write this subroutine:

########################################

Anonymous 
Printed Page 182
-4 ## A reader reports

an.d
->
and

## This report is confirmed.

########################################

Anonymous 
Printed Page 184
+3

documentation (or Appendix B), for
->
documentation (or Appendix B) for

########################################

Anonymous 
Printed Page 187
1st paragraph

for each enzyme.To simplify matters
->
for each enzyme. To simplify matters

#######################################

Anonymous 
Printed Page 188
-4

If you have two or three per line that have whitespace and are separated from each
other by whitespace,
->
We have two or three words per line that are separated from each
other by whitespace,

########################################

Anonymous 
Printed Page 188
-4

(which acts on the line as stored in the special variable @_.:
->
(which by default splits on the line stored in the special variable $_):

########################################

Anonymous 
Printed Page 188
-4

($name, $site) = split(" ")
->
@fields = split(" ");

########################################

Anonymous 
Printed Page 188
-2

$name = shift@fields;
$site = pop@fields;
->
$name = shift @fields;
$site = pop @fields;

########################################

Anonymous 
Printed Page 188
-1

the documentation on REBASE you found on its web site
->
the documentation from the REBASE web site

########################################

Anonymous 
Printed Page 189
+2

Of course, REBASE uses them, because a given restriction enzyme might well match
a few different recognition sites.
->
Of course, REBASE uses these IUB codes because a given restriction enzyme might well bind
to a few different DNA patterns, varying in one or more bases.

########################################

Anonymous 
Printed Page 189
+3

given a string,
->
given a string of sequence containing IUB codes,

########################################

Anonymous 
Printed Page 191
Example 9-2 Subroutine "parseREBASE"

# Read in the REBASE file
@rebasefile = get_file_data($rebasefile);

foreach ( @rebasefile ) {

!!! Should be: !!!

# Read in the REBASE file
my $rebase_filehandle = open_file($rebasefile);

while(<$rebase_filehandle>) {

########################################

Anonymous 
Printed Page 191
-1

You're using a foreach loop to process the lines of the bionet file stored in the
@rebasefile array.

!!! Should be: !!!

You're using a while loop to process the lines of the bionet file as they are
read in from the file using the filehandle called $rebase_filehandle.

########################################

Anonymous 
Printed Page 192
-1

evaluates and returns the right.
->
evaluates the right and returns.

#########################################

Anonymous 
Printed Page 193
+2

conditionals to their own blocks.
->
conditionals with their own blocks.

#######################################

Anonymous 
Printed Page 193
+3

and returns the left argument if it's true; if the left
argument doesn't evaluate to true, it evaluates and returns the right argument.
->
the left argument and returns if it's true; if the left
argument is false, it evaluates the right argument and returns true or false.

########################################

Anonymous 
Printed Page 193
-3

you skip the rest of the loop.
->
you skip the rest of the block and return to the top of the loop.

########################################

Anonymous 
Printed Page 200
+3 ## A reader reports

It's bad, because that same flexibility makes it harder to write programs that to
find and extract the desired annotations.
->
It's bad, because that same flexibility makes it harder to write programs that
find and extract the desired annotations.

## This is confirmed.

########################################

Anonymous 
Printed Page 203
-1

contains 12,813516 loci and
->
contains

########################################

Anonymous 
Printed Page 204
-3

over 8 trillion
->
over 8 billion

########################################

Anonymous 
Printed Page 205
+3

with each appearing as an element
->
with each line of the file appearing as an element

########################################

Anonymous 
Printed Page 205
+5

this datafile and the file record.gb in the next
->
library.gb, and the file record.gb which contains just one GenBank record, in the next

########################################

Anonymous 
Printed Page 206
## A reader reports

(typical)) foreach{ ... } section of the parse1() subroutine, starting at
middle of page;
Most of the book's code is pretty clear & consistent, but one thing that the au
thor keeps wavering on is the inclusion or omission of spaces on lines like the
ones here. Appreviating, the code here has these lines:

} elseif( $in_sequence) {
} elseif ( $line =~ /^ORIGIN/ ) {
} else{

Note that the second elsif is followed by a space, but the first one isn't and
neither is the else. Likewise, $in_sequence has a leading space but not a trail
ing one.

## This report is correct. In this code fragment it does interfere with readability.
## Since the code is so dense here, I'd prefer:
if ( $line =~ /^//
/ ) {
}elseif ( $in_sequence ) {
}elseif ( $line =~ /^ORIGIN/ ) {
}else {
## But in general it's a deliberate choice to vary these things. 1) All such variations
## are legal Perl, and for good reason. 2) Beginners are likely to encounter such
## variations as they encounter different programming styles. 3) Beginners experiment
## with different styles as they develop their own preferences, so 4) I show the
## beginners different styles, and discuss the issue in the book.
##
## I am fully aware of the reason for standards for such formatting issues.
## However, I feel even in professional code they are not an unbreakable rule,
## and that readability is paramount. (You may feel that the only way to
## ensure readability is to follow a rule consistently, but I disagree.)

########################################

Anonymous 
Printed Page 207
+4

so that Perl doesn't interpret them as prematurely ending the pattern.
The regular expression also ends with a newline //
,
which is then placed inside the usual delimiters: ///
/
->
so that Perl doesn't interpret them as the usual / delimiters. The regular
expression is anchored to the beginning of the line (^),
ends with a newline (
), and is placed inside the delimiters: /^//
/

########################################

Anonymous 
Printed Page 207
+4

you can use another delimiter around the regular expression
->
you can replace the / delimiter with any character, like "!",

########################################

Anonymous 
Printed Page 207
+4

like so: m!//
!).
->
like so: m!^//
! where the expression is now ^//
).

#########################################

Anonymous 
Printed Page 208
+1

Other methods of collecting annotation and sequence lines are possible, especially if
you go through the lines of the array more than once. You can scan through the
array, keeping track of the start-of-sequence and end-of-record line numbers, and
then go back and extract the annotation and sequence using an array splice (which
was described in the parseREBASE subroutine in Example 9-2). Here's an example:
->
Other methods of collecting annotation and sequence lines are possible, especially if
you go through the array more than once. If you first find the start-of-sequence
and end-of-record line numbers, you can do the extraction with an array slice, in
which you list the desired elements or indicate them with a range, for example:
@arrayslice = @array[0,3,5] or @arrayslice = @array[3..8]. Here we use a range:

## Note to Editor: "array slice" should be emphasized as a new term. If possible,
## it should be added to the index.

#######################################

Anonymous 
Printed Page 208
+1 in program listing ## A reader reports

/^//
/
->
m!^//
!

## This is confirmed.

########################################

Anonymous 
Printed Page 208
+1 in program listing ## A reader reports

<programlisting>
->
## This line should be deleted from the program listing.

## This is confirmed.

########################################

Anonymous 
Printed Page 208
-3

in Examples 6-2 and 6-3
->
in Examples 8-2 and 8-3

########################################

Anonymous 
Printed Page 209
+2

so it extends the ^ and the $
to match after, or before, a newline, embedded in the string.
->
so it extends the ^ to match after an embedded newline,
and the $ to match before an embedded newline.

########################################

Anonymous 
Printed Page 209
-3

First, let's examine
->
Let's examine

########################################

Anonymous 
Printed Page 209
-2

A call to read
->
After setting the input record separator to "//
", a call to read

#########################################

Anonymous 
Printed Page 218
open_file subroutine; ## A reader reports

In the open_file subroutine I keep getting an error message for the following line:

unless(open($fh, $filename)){

The error message reads:

Can't use an undefined value as filehandle reference at ./example1-5.pl line 52.

## This report is not confirmed, it doesn't happen to me at all. May be an
## error typing in the program, or perhaps it's behaving differently on an
## older version of Perl than I have? -Jim

#########################################

Anonymous 
Printed Page 219
Example 10-5 Subroutine "get_annotation_and_dna" at top of page ## A reader reports

# - given GenBank record, get annotation and DNA
->
# - given filehandle for GenBank file, get GenBank record

## This is confirmed. (N.B. This should only be changed at the top of the
## page, not on the second occurence of the line in the middle of the page.)

#########################################

Anonymous 
Printed Page 219
Example 10-5 Subroutine "get_annotation_and_dna"

$dna =~ s/[s/]//g;
!!!! Should be: !!!!
$dna =~ s/[s/d]//g;

#######################################

Anonymous 
Printed Page 223
+3

which is a special variable pattern between
->
which is a special variable that remembers the pattern that matched between

#########################################

Anonymous 
Printed Page 227
1st paragraph

"I then saved the output as text in the file blst.txt, which is available from this..."
blst.txt
should be
blast.txt

########################################

Anonymous 
Printed Page 228
-1

Example 10-8 finds
->
Example 10-7 finds

########################################

Anonymous 
Printed Page 229
+1

as this allows you to store, for instance, only one instance of an exon).
->
as a hash would allow you to store, for instance, only one value with key 'exon').

########################################

Anonymous 
Printed Page 230
+1

Example 10-8 gives the output:
->
Example 10-7 gives the output:

########################################

Anonymous 
Printed Page 231
+1

parse_features of Example 10-8,
->
parse_features of Example 10-7,

#########################################

Anonymous 
Printed Page 231
+1

code of Example 10-8:
->
code of Example 10-7:

#######################################

Anonymous 
Printed Page 235
middle of page; ## A reader reports

if ($offset)
->
if (defined $offset)

## $offset can have a valid zero value for the first accession number,
## which would fail the test for "if ($offset)"

## This report is confirmed. The book and the downloadable examples will be updated.

########################################

Anonymous 
Printed Page 239
+1

the effect on biology and medicine would be profound.
->
the effect on biology and medicine will be profound.

########################################

Anonymous 
Printed Page 239
+2

information form them.
->
information from them.

########################################

Anonymous 
Printed Page 241
-1

Since you're running this program on a folder that contains PDB files,
this is what you'll see:
->
You can download a small sample 'pdb' directory from this book's web site;
if you do, this is what you'll see when you run this program:

########################################

Anonymous 
Printed Page 242
+1

you can give the directory name the special name "." for the current directory,
->
you can just call the directory by the special name ".",

########################################

Anonymous 
Printed Page 242
+2

the special files
->
the special file names

########################################

Anonymous 
Printed Page 248
+3

The reason for using a subroutine that you define is that it enables you
->
File::Find is designed to call your own subroutines, because it enables you

#########################################

Anonymous 
Printed Page 257
Example 11-5

Omit this line:
print "****chain $chain ****
";

#######################################

Anonymous 
Printed Page 258
20th line of code; ## A reader reports

given an scalar containing SEQRES lines,
->
given a scalar containing SEQRES lines,

## This is confirmed.

#######################################

Anonymous 
Printed Page 260
-4

In Chapter 10, I demonstrated two ways to parse GenBank files into sequence and
annotation and then how to parse the annotation into finer and finer levels of detail.
->
In Chapter 10, I compared two ways to parse GenBank files into sequence and
annotation, and to parse the annotation into finer and finer levels of detail.

########################################

Anonymous 
Printed Page 260
-3

what field the input line was in.
->
which section of the file each input line came from.

########################################

Anonymous 
Printed Page 261
+2

captures the pattern matched, denoted by $&
->
copies the pattern matched, denoted by the special variable $& that always holds
the last successful pattern match,

########################################

Anonymous 
Printed Page 261
-4

Let's examine the subroutine extractSEQRES, now that the record types have been
parsed out, and extract the primary amino acid sequence.
->
Now that the record types have been parsed out, let's examine the subroutine extractSEQRES,
and see how it extracts the primary amino acid sequence.

########################################

Anonymous 
Printed Page 261
-2

The previous parse, in Example 11-4,
->
The subroutine parsePDBrecordtypes, in Example 11-5,

########################################

Anonymous 
Printed Page 261
-2

Our success with the previous parsePDBrecordtypes subroutine that used iteration
over lines (as opposed to regular expressions over multiline strings)
leads to the same approach here.
->
Our success in parsePDBrecordtypes using iteration over lines
(as opposed to regular expressions over multiline strings)
leads us to try the same approach here.

########################################

Anonymous 
Printed Page 262
+4

you won't have use for the strings of amino acids in three-character codes.
->
you might not encounter strings of amino acids in three-character codes.

########################################

Anonymous 
Printed Page 265
+2

and the element symbol.
->
and the element symbol. The $x, $y, and $z may also contain some spaces.

########################################

Anonymous 
Printed Page 265
-2

1.888 -8.251 -2.511 N
18.955 -10.180 10.777 C
!!! Should be !!!
1.888 -8.251 -2.511 N
-0.873 9.368 16.046 C

########################################

Anonymous 
Printed Page 266
+1 program code

printf "%8.3f%8.3f%8.3f %2s
", $x, $y, $z, $element;
->
print "$x $y $z $element
";

########################################

Anonymous 
Printed Page 266
-2

We've already seen the use of the printf function to format output with more
options then with the print function.
->
For column-specific data such as in PDB, an alternative with more options than
the print function is the printf function, which we'll see later in this chapter.

########################################

Anonymous 
Printed Page 266
-1 command example ## A reader reports

from the command line like so, assuming you saved the program
in a file called get_two_atoms:

%perl get_two_atoms pdb1a4O.ent
->
from the command line like so ("biocomp%" is the computer prompt), assuming you saved the program
in a file called get_two_atoms:

biocomp% perl get_two_atoms pdb/c1/pdb1c1f.ent

## This report is confirmed. The prompt has been explicitly noted.
## Also, the file name is now the same as in the preceding example.

########################################

Anonymous 
Printed Page 267
+1

Alternatively,
->
Alternatively, on Unix or Linux or Mac OS X,

########################################

Anonymous 
Printed Page 267
1st paragraph

get_two__atoms
->
get_two_atoms

########################################

Anonymous 
Printed Page 267
+1 program code

% cat pdb1a4O.ent | perl get_two_atoms

or

% perl get_two_atoms < pdb1a4O.ent
->
biocomp% cat pdb/c1/pdb1c1f.ent | perl get_two_atoms

or

coltrane% perl get_two_atoms < pdb/c1/pdb1c1f.ent

########################################

Anonymous 
Printed Page 267
-2

Unix or Linux
->
Unix or Linux or Mac OS X

########################################

Anonymous 
Printed Page 267
-2

Windows or Macintosh
->
Windows or older Macintosh

########################################

Anonymous 
Printed Page 267
-1

a program that outputs a secondary structure report, called stride.
->
a program called stride that outputs a secondary structure report.

########################################

Anonymous 
Printed Page 267
-1 ## A reader reports

http://www.embl.heidelberg.ole/stride/stride_info.html
->
http://www.embl-heidelberg.de/stride/stride_info.html

## This report is confirmed.

########################################

Anonymous 
Printed Page 267
-1

of a PDB filename and collect the output in the subroutine call_stride that follows.
->
of a PDB filename. I collect the output in the subroutine call_stride that follows.

########################################

Anonymous 
Printed Page 270
+2

The actual running of the program and collecting its output happens in just one line.
->
The actual running of the program and collecting its output happen in just one line.

########################################

Anonymous 
Printed Page 271
paragraphs +2 and +6

Move paragraph +2:

Using the subst function, the two for loops alter each line of the two arrays by saving
the 11th to the 60th positions of those strings. This is where the desired information
lies.

to the end of paragraph +6, which now reads:

Next, you want to save just those positions (or columns) of the lines that have the
sequence or structure information; you don't need the keywords, position numbers,
or the PDB entry name at the end of the lines. Using the subst function, the two for
loops alter each line of the two arrays by saving the 11th to the 60th positions.
This is where the desired information lies.

#########################################

Anonymous 
Printed Page 272
+1

Check the next section for a subroutine that will improve that output.
->
The exercises that follow ask you to write a subroutine that will improve that output.

#######################################

Anonymous 
Printed Page 274
+1

In biological research, the search for sequence similarity is very important. For
instance, a researcher who has discovered a potentially important DNA or protein
sequence wants to know if it's already been identified and characterized by another
researcher. If it hasn't, the researcher wants to know if it resembles any known
sequence from any organism. This information can provide vital clues as to the role
of the sequence in the organism.
->
In biological research, the search for sequence similarity is very important. For
instance, a researcher who has isolated a potentially important DNA or protein
sequence wants to know if it's already been identified and characterized by another
researcher. If it hasn't, the researcher wants to know if it resembles any known
sequence from any organism. This information can provide vital clues as to the role
of the sequence in the organism under study. And when no such resemblence is found,
it is evidence that the sequence may belong to a new class of genes or gene products.

########################################

Anonymous 
Printed Page 275
+1

There are a several
->
There are several

########################################

Anonymous 
Printed Page 285
+2

so that you match all the available lines.
->
to match all available such lines (at least one).

########################################

Anonymous 
Printed Page 288
code at bottom of page ## A reader reports

## This routine does not remove the characters "ct" from the word
## "Sbjct" found on each subject line. This causes the insertion
## of the "ct" preceding each subject line into the sequence
## returned in $subject. The value returned in $subject is always
## incorrect.

$query = join ( '' , ($HSP =~ /^Query.*
/gm) );

$subject = join ( '' , ($HSP =~ /^Sbjct.*
/gm) );
!!! Should be !!!
$query = join ( '' , ($HSP =~ /^Query(.*)
/gm) );

$subject = join ( '' , ($HSP =~ /^Sbjct(.*)
/gm) );

## This is confirmed.

########################################

Anonymous 
Printed Page 289
program output at top of page ## A reader reports

-> Subject String: ctggagatggctcagacctggaacctccggatgccggggacgacagcaagtctgagaatg
ggctgagaacgctcccatctactgcatctgtcgcaaaccggacatcaattgcttcatgattggacttgtgacaactgca
acgagtggttccatggagactgcatccggatca

!!! Should be !!!

-> Subject String: ggagatggctcagacctggaacctccggatgccggggacgacagcaagtctgagaatggg
gagaacgctcccatctactgcatctgtcgcaaaccggacatcaattgcttcatgattggatgtgacaactgcaacgagt
ggttccatggagactgcatccggatca

## This is confirmed.

########################################

Anonymous 
Printed Page 289
-5

## Delete this sentence:

Here you see that not only can a subroutine return an array on a scalar value;
it can also return a hash.

########################################

Anonymous 
Printed Page 290
+2

This is the nongreedy or minimal matching mentioned in Chapter 9.
->
This is the nongreedy or minimal matching; it matches the shortest string possible.
By default, * is greedy, matching the longest string possible.

########################################

Anonymous 
Printed Page 290
+4

before and after embedded newlines.
->
before and after embedded newlines, respectively.

########################################

Anonymous 
Printed Page 290
+6

the + following the other parentheses.
->
the + following the outer parentheses.

########################################

Anonymous 
Printed Page 291
+3

in the same manner as you would a print function.
->
in the same manner as you would in a print function.

########################################

Anonymous 
Printed Page 291
-3

Here's what is in Example 12-3.
->
Here's what is in the example just given.

########################################

Anonymous 
Printed Page 292
-1

FORTRAN programming-language conventions
->
FORTRAN programming language conventions

########################################

Anonymous 
Printed Page 294
+3 ## A reader reports confusion over the output on page 293, so I add on p.294

(which, in this case, is true.)
->
(in our example it prints "This DNA is so...")

## This is confirmed.

########################################

Anonymous 
Printed Page 295
+2

Bioperl doesn't provide complete programs. Rather, it provides a fairly large-and
growing-set of modules for accomplishing common tasks, including some tasks
you've seen in this book. You're responsible for writing the code that holds the mod-
ules together. By providing these ready and (usually) easy-to-use modules, Bioperl
makes developing bioinformatics applications in Perl faster and easier. There are exam-
ple programs for most of the modules, which can be examined and modified to get
started.
->
Bioperl doesn't provide the programmer with complete programs. Rather, it provides
a fairly large-and growing-set of modules for accomplishing common tasks, including
some tasks you've seen in this book. You have to write the programs that use the
modules. The goal of Bioperl is to make developing bioinformatics applications
easier, by providing easy-to-use standard modules. There are example
programs for most of the modules, which can be examined and modified to get
started.

########################################

Anonymous 
Printed Page 303
-1

I've frequently mentioned modules and CPAN
->
I've frequently mentioned modules, and CPAN

########################################

Anonymous 
Printed Page 305
+2

the thousand of genes and gene products
->
the genes and gene products

########################################

Anonymous 
Printed Page 305
+3

Graphics programming language present
->
Graphics programming languages present

########################################

Anonymous 
Printed Page 310
+5 ## A reader reports

"low signal-to-noise ration"
->
"low signal-to-noise ratio"

## This is confirmed.

########################################

Anonymous 
Printed Page 312
+2

Np-Completeness
->
NP-Completeness

#########################################

Anonymous 
Printed Page 313
+4

Baxecvanis
->
Baxevanis

#######################################

Anonymous 
Printed Page 315
+2

The Perl programs in this book start with the line:
->
The Perl programs in this book start with the line (with or without the -w):

########################################

Anonymous 
Printed Page 315
+3

If the Perl program file was called myprogram, and had executable permissions,
->
If the Perl program file is called myprogram, and has executable permissions,

########################################

Anonymous 
Printed Page 316
+1 and +2

## The three instances of 1,000 should be changed. The comma is good
## Chicago Manual of Style, but incorrect Perl.

1,000
->
1000

########################################

Anonymous 
Printed Page 322
-4

(and if you're not careful, strings as well).
->
(and may give you unexpected results if you apply them to strings, as well).

########################################

Anonymous 
Printed Page 323
+1

(or a to b)
->
(or 'a' to 'b')

########################################

Anonymous 
Printed Page 325
-1

instead of not or and.
->
instead of not, or, and.

## Also, the typesetting has made "not" and "and" in a special font, but
## has not done so for "or". All three should be in a special font.

########################################

Anonymous 
Printed Page 326
-3

and in their variants and loops.
->
and their variants, and in loops.

########################################

Anonymous 
Printed Page 328
+5

This shows that a pattern match can return a count of the number of translations made
in a string, which is then assigned to the variable $count.
->
This shows how a pattern match can return a count of the number of patterns found
in a string, which in this case is then assigned to the variable $count.

########################################

Anonymous 
Printed Page 329
-2

any variable name or none,
->
## The word 'none' is in a special font; it should be in normal font, as this
## is not a variable name

########################################

Anonymous 
Printed Page 332
+2

MacOS X
->
Mac OS X

Anonymous