The errata list is a list of errors and their corrections that were found after the product was released.
The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.
Version |
Location |
Description |
Submitted by |
Date submitted |
Printed |
Page 20
4th paragraph, step 2 |
There appear to be two spaces between "you" and "reach" in "until you reach the
center."
|
Anonymous |
|
Printed |
Page 21
program flaw |
This program could get stuck in a loop if you have two directories containing
links to each other. I suggest putting the following above the check for -d:
if (-l $name){ # skip links
next;
}
This will not get stuck in an endless recursion path. There may be a more
eloquent way to do this, but this works.
|
Anonymous |
|
Printed |
Page 23
There is a subroutine called CheckFile, which has the following lines |
for (my $i=0;$i< $stat[7];$i++){
my $r=sysread(T,$i,1);
if ($r !=1) {
close(T);
return 0;
}
The line in question is the "my $r=sysread(T,$i,1);" line. The sysread is
reading one byte into the iterator $i, so the second time the "for" loop is
executed, it attempts to compare the first byte which could be a
letter/number/non-printing character to the number of bytes of the file. This
should be rewritten as follows:
for (my $i=0;$i< $stat[7];$i++){
my $buf;
my $r=sysread(T,$buf,1);
if ($r !=1) {
close(T);
return 0;
}
This error can be discovered by turning strict on for the entire script. I
would recommend to the author to turn strict on for every script in the book.
It should improve things a bit.
|
Anonymous |
|
Printed |
Page 27
source code at top of page using unlink function |
I would like to see a warning about the use of "unlink". Using "unlink" to
remove a directory could cause serious file system problems. Granted, in perl
you would have to run the script as superuser with the "-U" flag on the perl
interpreter. But because of the danger of using unlink I think the author
should have mentioned this.
|
Anonymous |
|
Printed |
Page 39
sub EdQuota |
The line
print NEWTEMP;
should be outside the if (/^fs $fss+){ block. Otherwise, the only line
printed to NEWTEMP and ultimately to $tfile is the changed line.
|
Anonymous |
|
Printed |
Page 39
code example, first comment |
In the comment,
# open a scratch file, could use IO::File->new_tmpfile() instead
the -> appears to have been typeset into an actual arrow character instead of the
Perlish minus-greater.
|
Anonymous |
|
Printed |
Page 40
code |
$dev = Quota::getcarg
should be
$dev = Quota::getqcarg
and
($curblock,$soft,$hard,$curinode,$btimeout,$curinode,$isoft,$ihard,$itimeout)
should be
($curblock,$soft,$hard,$btimeout,$curinode,$isoft,$ihard,$itimeout)
|
Anonymous |
|
Printed |
Page 48
code listing |
if ($dirinfo->mode & 022 and (!$stat->mode & 01000));
should be:
if ($dirinfo->mode & 022 and (!$dirinfo->mode & 01000));
|
Anonymous |
|
Printed |
Page 60
second and third code segments |
Missing closing parenthesis before "die" in first segment; ";" instead of closing parenthesis before "die" in second segment. Both would be more idiomatically coded as
Win32::Lanman::LsaLookupNames(..) or die "..";
|
Anonymous |
|
Printed |
Page 77
code |
print OUTPUTFILE XMLout(TransformForWrite($queue),rootname => "queue");
should be:
print OUTPUTFILE XMLout(TransformForWrite($queue),rootname => undef);
|
Anonymous |
|
Printed |
Page 98
Example Perl code, 3rd paragraph |
In the example code, when extracting STDOUT from PULIST.EXE, there have been, what
seem to be, a miss in printing.
The following code is found in the book:
$pulistexe = "\bin\PULIST.EXE"; # location of the executable
open(PULIST,"$pulistexe|") or die "Can't execute $pulistexe:$!
";
while(defined($_,<PULIST>)){
($pname,$pid,$puser) = /^(S+)s*(d+)s*(.+)/;
print "$pname:$pid:$puser
";
close(PULIST);
The code should look like this:
$pulistexe = "\bin\PULIST.EXE"; # location of the executable
open(PULIST,"$pulistexe|") or die "Can't execute $pulistexe:$!
";
while(defined($_,<PULIST>)){
($pname,$pid,$puser) = /^(S+)s*(d+)s*(.+)/;
print "$pname:$pid:$puser
";
}
close(PULIST);
The error was a missing closing curly-brace just before close(PULIST);
|
Anonymous |
|
Printed |
Page 111-113
|
... =
Win32::OLE->GetObject('winmgmts:{impersonationLevel}=impersonate}!Win32_Proc
ess') ...
the } after impersonationLevel is wrong. The correct syntax should be
...=
Win32::OLE->GetObject('winmgmts:{impersonationLevel=impersonate}!Win32_Proce
ss')...
|
Anonymous |
|
Printed |
Page 127
Source code |
After comment "deal with a file set..."
tVREG does not exist in lsof output. Change
if (substr($_,0,5) eq "tVREG") {
to
if (substr($_,0,4) eq "tREG") {
|
Anonymous |
|
Printed |
Page 134
code example, handling comments and blank lines |
The code section
next if /^#/; # skip comments lines
next if /^$/; # skip empty lines
s/s*#.*$//; # delete in-line comments and preceding whitespace
doesn't skip lines with indented comments, nor lines with only whitespace. I prefer
the following construct, which surely many other people use but I've never run across
elsewhere:
s/s*#.*//; # strip comments and optional preceding whitespace
next if /^s*$/; # skip (now-)blank lines
|
Anonymous |
|
Printed |
Page 134
3rd non-code paragraph |
The final sentence ("Because it is so important, I'll return to this topic later in
the chapter") is missing the final period.
|
Anonymous |
|
Printed |
Page 152, 156
various lines of code |
The code starts on the previous page defining a date format of yyyymmdd which
is 8 characters. As the script progresses, this changes to 6 characters for
the date instead of 8. For example, the line on page 152 (18 lines down the
page) reads:
$serial = sprintf("%6d%02d",$today,$count);
It should read:
$serial = sprintf("%8d%02d",$today,$count);
There are equivalent errors on page 152 in lines 10, 15 and 16. Also on page
156, lines 17, 20, 21 and 23.
|
Anonymous |
|
Printed |
Page 177
Table 6-1 now states that Net::LDAP does support SSL. |
It appears that the table originally indicated that SSL is not available for
Net::LDAP. This correction would seem to indicate that SSL is available with
Net::LDAP. Paragraph 2 of page 179 seems to contradict this by stating "Of
the Perl modules available, only perLDAP offers LDAPS (SSL-encrypted
sessions).". LDAPS (SSL) in Net::LDAP or not?
|
Anonymous |
|
Printed |
Page 215
3rd line from top |
Shouldn't the line $u->SetInfo(); read $c->SetInfo() as $u is never set in the delete
example block.
|
Anonymous |
|
Printed |
Page 230
last example on page |
the syntax in the for loop is incorrect. it reads:
for ($i=0; $i < $sth->{NUM_OF_FIELDS};i++;) {
but should read:
for ($i=0; $i < $sth->{NUM_OF_FIELDS}; $i++) {
^^^^^^
|
Anonymous |
|
Printed |
Page 278
1st Code section |
The line:
or die "Cannot open file $filename: $! $BerkeleyDB::Error
" ;
seems like it should be:
or die "Cannot open file $blacklist: $! $BerkeleyDB::Error
" ;
(The filename is stored in the variable $blacklist)
|
Anonymous |
|
Printed |
Page 402
paragraph preceding "SQL Stragglers" |
The example
USE sysadm
SELECT name,servicevendor,enddate
FROM contracts, hosts
WHERE contracts.name = hosts.name
is followed by the explaination
ON contracts.name = hosts.name ...
Either the WHERE on ON must be incorrect.
|
Anonymous |
|