did-you-know? rent-now

Amazon no longer offers textbook rentals. We do!

did-you-know? rent-now

Amazon no longer offers textbook rentals. We do!

We're the #1 textbook rental company. Let us show you why.

9780596003135

Perl Cookbook

by
  • ISBN13:

    9780596003135

  • ISBN10:

    0596003137

  • Edition: 2nd
  • Format: Paperback
  • Copyright: 2003-08-01
  • Publisher: Oreilly & Associates Inc
  • Purchase Benefits
  • Free Shipping Icon Free Shipping On Orders Over $35!
    Your order must be $35 or more to qualify for free economy shipping. Bulk sales, PO's, Marketplace items, eBooks and apparel do not qualify for this offer.
  • eCampus.com Logo Get Rewarded for Ordering Your Textbooks! Enroll Now
List Price: $49.95 Save up to $4.96
  • Buy New
    $48.45
    Add to Cart Free Shipping Icon Free Shipping

    USUALLY SHIPS IN 2-3 BUSINESS DAYS

Supplemental Materials

What is included with this book?

Summary

Perl Cookbook, 2nd Edition is a comprehensive collection of problems, solutions, and practical examples for anyone programming in Perl. The book contains hundreds of rigorously reviewed Perl "recipes" for manipulating strings, numbers, dates, arrays, and hashes; pattern matching and text substitutions; references, data structures, objects, and classes; signals and exceptions; and much more. In the second edition of this classic book, the authors have revisited the topic areas to add and revise many recipes, and they have also written new chapters to cover emerging topics such as XML processing and embedding programs with the Inline module.

Author Biography

Tom Christiansen is a freelance consultant specializing in Perl training and writing. After working for several years for TSR Hobbies (of Dungeons and Dragons fame), he set off for college where he spent a year in Spain and five in America, dabbling in music, linguistics, programming, and some half-dozen different spoken languages. Tom finally escaped UW-Madison with B.A.s in Spanish and computer science and an M.S. in computer science. He then spent five years at Convex as a jack-of-all-trades working on everything from system administration to utility and kernel development, with customer support and training thrown in for good measure. Tom also served two terms on the USENIX Association Board of directors. With over fifteen years' experience in UNIX system administration and programming, Tom presents seminars internationally. Living in the foothills above Boulder, Colorado, surrounded by mule deer, skunks, and the occasional mountain lion and black bear, Tom takes summers off for hiking, hacking, birding, music making, and gaming.

Nathan Torkington is a banjo player, father, and husband. His crimes in the computing community include: coauthor of the Perl Cookbook, editor for O'Reilly and Associates, content coordinator for the Open Source Convention and Perl Conference, and project manager for perl6.

Table of Contents

Foreword xix
Preface xxi
1. Strings 1(58)
1.1 Accessing Substrings
7(3)
1.2 Establishing a Default Value
10(2)
1.3 Exchanging Values Without Using Temporary Variables
12(1)
1.4 Converting Between Characters and Values
13(2)
1.5 Using Named Unicode Characters
15(2)
1.6 Processing a String One Character at a Time
17(2)
1.7 Reversing a String by Word or Character
19(2)
1.8 Treating Unicode Combined Characters as Single Characters
21(1)
1.9 Canonicalizing Strings with Unicode Combined Characters
22(2)
1.10 Treating a Unicode String as Octets
24(1)
1.11 Expanding and Compressing Tabs
25(2)
1.12 Expanding Variables in User Input
27(2)
1.13 Controlling Case
29(2)
1.14 Properly Capitalizing a Title or Headline
31(2)
1.15 Interpolating Functions and Expressions Within Strings
33(2)
1.16 Indenting Here Documents
35(4)
1.17 Reformatting Paragraphs
39(2)
1.18 Escaping Characters
41(2)
1.19 Trimming Blanks from the Ends of a String
43(1)
1.20 Parsing Comma-Separated Data
44(4)
1.21 Constant Variables
48(2)
1.22 Soundex Matching
50(2)
1.23 Program: fixstyle
52(3)
1.24 Program: psgrep
55(4)
2. Numbers 59(31)
2.1 Checking Whether a String Is a Valid Number
60(3)
2.2 Rounding Floating-Point Numbers
63(4)
2.3 Comparing Floating-Point Numbers
67(1)
2.4 Operating on a Series of Integers
68(2)
2.5 Working with Roman Numerals
70(1)
2.6 Generating Random Numbers
71(1)
2.7 Generating Repeatable Random Number Sequences
72(1)
2.8 Making Numbers Even More Random
73(1)
2.9 Generating Biased Random Numbers
74(2)
2.10 Doing Trigonometry in Degrees, Not Radians
76(1)
2.11 Calculating More Trigonometric Functions
77(1)
2.12 Taking Logarithms
78(2)
2.13 Multiplying Matrices
80(2)
2.14 Using Complex Numbers
82(1)
2.15 Converting Binary, Octal, and Hexadecimal Numbers
83(1)
2.16 Putting Commas in Numbers
84(1)
2.17 Printing Correct Plurals
85(2)
2.18 Program: Calculating Prime Factors
87(3)
3. Dates and Times 90(20)
3.1 Finding Today's Date
92(2)
3.2 Converting DMYHMS to Epoch Seconds
94(1)
3.3 Converting Epoch Seconds to DMYHMS
95(1)
3.4 Adding to or Subtracting from a Date
96(1)
3.5 Difference of Two Dates
97(2)
3.6 Day in a Week/Month/Year or Week Number
99(1)
3.7 Parsing Dates and Times from Strings
100(1)
3.8 Printing a Date
101(2)
3.9 High-Resolution Timers
103(2)
3.10 Short Sleeps
105(1)
3.11 Program: hopdelta
106(4)
4. Arrays 110(40)
4.1 Specifying a List in Your Program
111(2)
4.2 Printing a List with Commas
113(2)
4.3 Changing Array Size
115(2)
4.4 Implementing a Sparse Array
117(2)
4.5 Iterating Over an Array
119(3)
4.6 Iterating Over an Array by Reference
122(2)
4.7 Extracting Unique Elements from a List
124(2)
4.8 Finding Elements in One Array but Not Another
126(2)
4.9 Computing Union, Intersection, or Difference of Unique Lists
128(2)
4.10 Appending One Array to Another
130(1)
4.11 Reversing an Array
131(1)
4.12 Processing Multiple Elements of an Array
132(2)
4.13 Finding the First List Element That Passes a Test
134(2)
4.14 Finding All Elements in an Array Matching Certain Criteria
136(2)
4.15 Sorting an Array Numerically
138(1)
4.16 Sorting a List by Computable Field
139(4)
4.17 Implementing a Circular List
143(1)
4.18 Randomizing an Array
144(1)
4.19 Program: words
144(2)
4.20 Program: permute
146(4)
5. Hashes 150(29)
5.1 Adding an Element to a Hash
152(1)
5.2 Testing for the Presence of a Key in a Hash
153(2)
5.3 Creating a Hash with Immutable Keys or Values
155(1)
5.4 Deleting from a Hash
156(1)
5.5 Traversing a Hash
157(3)
5.6 Printing a Hash
160(1)
5.7 Retrieving from a Hash in Insertion Order
161(1)
5.8 Hashes with Multiple Values per Key
162(2)
5.9 Inverting a Hash
164(2)
5.10 Sorting a Hash
166(1)
5.11 Merging Hashes
167(2)
5.12 Finding Common or Different Keys in Two Hashes
169(1)
5.13 Hashing References
170(1)
5.14 Presizing a Hash
171(1)
5.15 Finding the Most Common Anything
172(1)
5.16 Representing Relationships Between Data
173(1)
5.17 Program: dutree
174(5)
6. Pattern Matching 179(60)
6.1 Copying and Substituting Simultaneously
185(1)
6.2 Matching Letters
186(2)
6.3 Matching Words
188(1)
6.4 Commenting Regular Expressions
189(3)
6.5 Finding the Nth Occurrence of a Match
192(3)
6.6 Matching Within Multiple Lines
195(3)
6.7 Reading Records with a Separator
198(1)
6.8 Extracting a Range of Lines
199(3)
6.9 Matching Shell Globs as Regular Expressions
202(1)
6.10 Speeding Up Interpolated Matches
203(2)
6.11 Testing for a Valid Pattern
205(2)
6.12 Honoring Locale Settings in Regular Expressions
207(2)
6.13 Approximate Matching
209(1)
6.14 Matching from Where the Last Pattern Left Off
210(2)
6.15 Greedy and Non-Greedy Matches
212(3)
6.16 Detecting Doubled Words
215(3)
6.17 Matching Nested Patterns
218(2)
6.18 Expressing AND, OR, and NOT in a Single Pattern
220(4)
6.19 Matching a Valid Mail Address
224(2)
6.20 Matching Abbreviations
226(2)
6.21 Program: urlify
228(1)
6.22 Program: tcgrep
229(6)
6.23 Regular Expression Grab Bag
235(4)
7. File Access 239(61)
7.1 Opening a File
247(4)
7.2 Opening Files with Unusual Filenames
251(2)
7.3 Expanding Tildes in Filenames
253(1)
7.4 Making Perl Report Filenames in Error Messages
254(1)
7.5 Storing Filehandles into Variables
255(3)
7.6 Writing a Subroutine That Takes Filehandles as Built-ins Do
258(1)
7.7 Caching Open Output Filehandles
259(1)
7.8 Printing to Many Filehandles Simultaneously
260(2)
7.9 Opening and Closing File Descriptors by Number
262(1)
7.10 Copying Filehandles
263(2)
7.11 Creating Temporary Files
265(1)
7.12 Storing a File Inside Your Program Text
266(2)
7.13 Storing Multiple Files in the DATA Area
268(2)
7.14 Writing a Unix-Style Filter Program
270(4)
7.15 Modifying a File in Place with a Temporary File
274(2)
7.16 Modifying a File in Place with the -i Switch
276(1)
7.17 Modifying a File in Place Without a Temporary File
277(2)
7.18 Locking a File
279(2)
7.19 Flushing Output
281(3)
7.20 Doing Non-Blocking I/O
284(1)
7.21 Determining the Number of Unread Bytes
285(2)
7.22 Reading from Many Filehandles Without Blocking
287(2)
7.23 Reading an Entire Line Without Blocking
289(2)
7.24 Program: netlock
291(3)
7.25 Program: lockarea
294(6)
8. File Contents 300(46)
8.1 Reading Lines with Continuation Characters
306(1)
8.2 Counting Lines (or Paragraphs or Records) in a File
307(2)
8.3 Processing Every Word in a File
309(1)
8.4 Reading a File Backward by Line or Paragraph
310(2)
8.5 Trailing a Growing File
312(2)
8.6 Picking a Random Line from a File
314(1)
8.7 Randomizing All Lines
315(1)
8.8 Reading a Particular Line in a File
316(2)
8.9 Processing Variable-Length Text Fields
318(1)
8.10 Removing the Last Line of a File
319(1)
8.11 Processing Binary Files
320(1)
8.12 Using Random-Access I/O
321(1)
8.13 Updating a Random-Access File
322(2)
8.14 Reading a String from a Binary File
324(1)
8.15 Reading Fixed-Length Records
325(1)
8.16 Reading Configuration Files
326(3)
8.17 Testing a File for Trustworthiness
329(2)
8.18 Treating a File as an Array
331(2)
8.19 Setting the Default I/O Layers
333(1)
8.20 Reading or Writing Unicode from a Filehandle
333(3)
8.21 Converting Microsoft Text Files into Unicode
336(2)
8.22 Comparing the Contents of Two Files
338(1)
8.23 Pretending a String Is a File
339(1)
8.24 Program: tailwtmp
340(1)
8.25 Program: tctee
341(1)
8.26 Program: laston
342(1)
8.27 Program: Flat File Indexes
343(3)
9. Directories 346(27)
9.1 Getting and Setting Timestamps
351(2)
9.2 Deleting a File
353(1)
9.3 Copying or Moving a File
354(1)
9.4 Recognizing Two Names for the Same File
355(1)
9.5 Processing All Files in a Directory
356(2)
9.6 Globbing, or Getting a List of Filenames Matching a Pattern
358(1)
9.7 Processing All Files in a Directory Recursively
359(3)
9.8 Removing a Directory and Its Contents
362(1)
9.9 Renaming Files
363(2)
9.10 Splitting a Filename into Its Component Parts
365(2)
9.11 Working with Symbolic File Permissions Instead of Octal Values
367(2)
9.12 Program: symirror
369(1)
9.13 Program: 1st
370(3)
10. Subroutines 373(34)
10.1 Accessing Subroutine Arguments
374(2)
10.2 Making Variables Private to a Function
376(2)
10.3 Creating Persistent Private Variables
378(1)
10.4 Determining Current Function Name
379(2)
10.5 Passing Arrays and Hashes by Reference
381(1)
10.6 Detecting Return Context
382(1)
10.7 Passing by Named Parameter
383(2)
10.8 Skipping Selected Return Values
385(1)
10.9 Returning More Than One Array or Hash
386(1)
10.10 Returning Failure
387(1)
10.11 Prototyping Functions
388(3)
10.12 Handling Exceptions
391(2)
10.13 Saving Global Values
393(4)
10.14 Redefining a Function
397(2)
10.15 Trapping Undefined Function Calls with AUTOLORD
399(1)
10.16 Nesting Subroutines
400(1)
10.17 Writing a Switch Statement
401(3)
10.18 Program: Sorting Your Mail
404(3)
11. References and Records 407(37)
11.1 Taking References to Arrays
413(2)
11.2 Making Hashes of Arrays
415(1)
11.3 Taking References to Hashes
416(1)
11.4 Taking References to Functions
417(3)
11.5 Taking References to Scalars
420(1)
11.6 Creating Arrays of Scalar References
421(2)
11.7 Using Closures Instead of Objects
423(1)
11.8 Creating References to Methods
424(1)
11.9 Constructing Records
425(3)
11.10 Reading and Writing Hash Records to Text Files
428(1)
11.11 Printing Data Structures
429(2)
11.12 Copying Data Structures
431(1)
11.13 Storing Data Structures to Disk
432(2)
11.14 Transparently Persistent Data Structures
434(1)
11.15 Coping with Circular Data Structures Using Weak References
435(3)
11.16 Program: Outlines
438(3)
11.17 Program: Binary Trees
441(3)
12. Packages, Libraries, and Modules 444(54)
12.1 Defining a Module's Interface
449(2)
12.2 Trapping Errors in require or use
451(2)
12.3 Delaying use Until Runtime
453(2)
12.4 Making Variables Private to a Module
455(2)
12.5 Making Functions Private to a Module
457(2)
12.6 Determining the Caller's Package
459(2)
12.7 Automating Module Cleanup
461(2)
12.8 Keeping Your Own Module Directory
463(2)
12.9 Preparing a Module for Distribution
465(2)
12.10 Speeding Module Loading with SelfLoader
467(1)
12.11 Speeding Up Module Loading with Autoloader
468(1)
12.12 Overriding Built-in Functions
469(2)
12.13 Overriding a Built-in Function in All Packages
471(2)
12.14 Reporting Errors and Warnings Like Built-ins
473(2)
12.15 Customizing Warnings
475(4)
12.16 Referring to Packages Indirectly
479(1)
12.17 Using h2ph to Translate C #include Files
480(3)
12.18 Using h2xs to Make a Module with C Code
483(3)
12.19 Writing Extensions in C with Inline: C
486(1)
12.20 Documenting Your Module with Pod
487(2)
12.21 Building and Installing a CPALA Module
489(3)
12.22 Example: Module Template
492(1)
12.23 Program: Finding Versions and Descriptions of Installed Modules
493(5)
13. Classes, Objects, and Ties 498(50)
13.1 Constructing an Object
506(2)
13.2 Destroying an Object
508(2)
13.3 Managing Instance Data
510(3)
13.4 Managing Class Data
513(2)
13.5 Using Classes as Structs
515(4)
13.6 Cloning Constructors
519(1)
13.7 Copy Constructors
520(2)
13.8 Invoking Methods Indirectly
522(2)
13.9 Determining Subclass Membership
524(1)
13.10 Writing an Inheritable Class
525(2)
13.11 Accessing Overridden Methods
527(2)
13.12 Generating Attribute Methods Using AUTOLOAD
529(3)
13.13 Coping with Circular Data Structures Using Objects
532(3)
13.14 Overloading Operators
535(5)
13.15 Creating Magic Variables with tie
540(8)
14. Database Access 548(35)
14.1 Making and Using a DBM File
550(2)
14.2 Emptying a DBM File
552(1)
14.3 Converting Between DBM Files
553(2)
14.4 Merging DBM Files
555(1)
14.5 Sorting Large DBM Files
556(2)
14.6 Storing Complex Data in a DBM File
558(1)
14.7 Persistent Data
559(2)
14.8 Saving Query Results to Excel or CSV
561(1)
14.9 Executing an SQL Command Using DBI
562(3)
14.10 Escaping Quotes
565(1)
14.11 Dealing with Database Errors
566(2)
14.12 Repeating Queries Efficiently
568(2)
14.13 Building Queries Programmatically
570(1)
14.14 Finding the Number of Rows Returned by a Query
571(1)
14.15 Using Transactions
572(2)
14.16 Viewing Data One Page at a Time
574(2)
14.17 Querying a CSV File with SQL
576(1)
14.18 Using SQL Without a Database Server
577(2)
14.19 Program: ggh-Grep Netscape Global History
579(4)
15. Interactivity 583(39)
15.1 Parsing Program Arguments
585(2)
15.2 Testing Whether a Program Is Running Interactively
587(1)
15.3 Clearing the Screen
588(1)
15.4 Determining Terminal or Window Size
589(1)
15.5 Changing Text Color
590(2)
15.6 Reading Single Characters from the Keyboard
592(1)
15.7 Ringing the Terminal Bell
593(2)
15.8 Using POSIX termios
595(2)
15.9 Checking for Waiting Input
597(1)
15.10 Reading Passwords
597(2)
15.11 Editing Input
599(1)
15.12 Managing the Screen
600(3)
15.13 Controlling Another Program with Expect
603(2)
15.14 Creating Menus with Tk
605(2)
15.15 Creating Dialog Boxes with Tk
607(3)
15.16 Responding to Tk Resize Events
610(2)
15.17 Removing the DOS Shell Window with Windows Perl/Tk
612(1)
15.18 Graphing Data
613(1)
15.19 Thumbnailing Images
614(1)
15.20 Adding Text to an Image
615(1)
15.21 Program: Small termcap Program
616(2)
15.22 Program: tkshufflepod
618(2)
15.23 Program: graphbox
620(2)
16. Process Management and Communication 622(50)
16.1 Gathering Output from a Program
625(1)
16.2 Running Another Program
626(3)
16.3 Replacing the Current Program with a Different One
629(1)
16.4 Reading or Writing to Another Program
630(2)
16.5 Filtering Your Own Output
632(2)
16.6 Preprocessing Input
634(1)
16.7 Reading STDERR from a Program
635(3)
16.8 Controlling Input and Output of Another Program
638(1)
16.9 Controlling the Input, Output, and Error of Another Program
639(2)
16.10 Communicating Between Related Processes
641(6)
16.11 Making a Process Look Like a File with Named Pipes
647(3)
16.12 Sharing Variables in Different Processes
650(2)
16.13 Listing Available Signals
652(1)
16.14 Sending a Signal
653(1)
16.15 Installing a Signal Handler
654(1)
16.16 Temporarily Overriding a Signal Handler
655(1)
16.17 Writing a Signal Handler
656(3)
16.18 Catching Ctrl-C
659(1)
16.19 Avoiding Zombie Processes
660(3)
16.20 Blocking Signals
663(1)
16.21 Timing Out an Operation
664(1)
16.22 Turning Signals into Fatal Errors
665(1)
16.23 Program: sigrand
666(6)
17. Sockets 672(47)
17.1 Writing a TCP Client
674(2)
17.2 Writing a TCP Server
676(3)
17.3 Communicating over TCP
679(3)
17.4 Setting Up a UDP Client
682(2)
17.5 Setting Up a UDP Server
684(2)
17.6 Using Unix Domain Sockets
686(2)
17.7 Identifying the Other End of a Socket
688(1)
17.8 Finding Your Own Name and Address
689(1)
17.9 Closing a Socket After Forking
690(2)
17.10 Writing Bidirectional Clients
692(2)
17.11 Forking Servers
694(1)
17.12 Pre-Forking Servers
695(3)
17.13 Non-Forking Servers
698(3)
17.14 Multitasking Server with Threads
701(2)
17.15 Writing a Multitasking Server with POE
703(2)
17.16 Writing a Multihomed Server
705(1)
17.17 Making a Daemon Server
706(2)
17.18 Restarting a Server on Demand
708(2)
17.19 Managing Multiple Streams of Input
710(3)
17.20 Program: backsniff
713(1)
17.21 Program: fwdport
714(5)
18. Internet Services 719(37)
18.1 Simple DNS Lookups
721(3)
18.2 Being an FTP Client
724(3)
18.3 Sending Mail
727(3)
18.4 Reading and Posting Usenet News Messages
730(2)
18.5 Reading Mail with POPS
732(2)
18.6 Simulating Telnet from a Program
734(2)
18.7 Pinging a Machine
736(2)
18.8 Accessing an LDAP Server
738(3)
18.9 Sending Attachments in Mail
741(3)
18.10 Extracting Attachments from Mail
744(2)
18.11 Writing an XML-RPC Server
746(2)
18.12 Writing an XML-RPC Client
748(1)
18.13 Writing a SOAP Server
749(1)
18.14 Writing a SOAP Client
750(1)
18.15 Program: rfrm
751(2)
18.16 Program: exen and vrfy
753(3)
19. CGI Programming 756(36)
19.1 Writing a CGI Script
760(2)
19.2 Redirecting Error Messages
762(1)
19.3 Fixing a 500 Server Error
763(4)
19.4 Writing a Safe CGI Program
767(3)
19.5 Executing Commands Without Shell Escapes
770(3)
19.6 Formatting Lists and Tables with HTML Shortcuts
773(2)
19.7 Redirecting to a Different Location
775(2)
19.8 Debugging the Raw HTTP Exchange
777(2)
19.9 Managing Cookies
779(2)
19.10 Creating Sticky Widgets
781(2)
19.11 Writing a Multiscreen CGI Script
783(2)
19.12 Saving a Form to a File or Mail Pipe
785(2)
19.13 Program: chemiserie
787(5)
20. Web Automation 792(37)
20.1 Fetching a URL from a Perl Script
793(3)
20.2 Automating Form Submission
796(1)
20.3 Extracting URLs
797(3)
20.4 Converting ASCII to HTML
800(1)
20.5 Converting HTML to ASCII
801(1)
20.6 Extracting or Removing HTML Tags
802(2)
20.7 Finding Stale Links
804(1)
20.8 Finding Fresh Links
805(2)
20.9 Using Templates to Generate HTML
807(3)
20.10 Mirroring Web Pages
810(1)
20.11 Creating a Robot
811(1)
20.12 Parsing a Web Server Log File
812(1)
20.13 Processing Server Logs
813(3)
20.14 Using Cookies
816(1)
20.15 Fetching Password-Protected Pages
817(1)
20.16 Fetching https:// Web Pages
818(1)
20.17 Resuming an HTTP GET
819(1)
20.18 Parsing HTML
820(3)
20.19 Extracting Table Data
823(2)
20.20 Program: htmlsub
825(2)
20.21 Program: hrefsub
827(2)
21. mod_perl 829(34)
21.1 Authenticating
834(1)
21.2 Setting Cookies
835(2)
21.3 Accessing Cookie Values
837(1)
21.4 Redirecting the Browser
838(1)
21.5 Interrogating Headers
838(1)
21.6 Accessing Form Parameters
839(1)
21.7 Receiving Uploaded Files
840(2)
21.8 Speeding Up Database Access
842(1)
21.9 Customizing Apache's Logging
843(2)
21.10 Transparently Storing Information in URLs
845(1)
21.11 Communicating Between mod_perl and PHP
846(1)
21.12 Migrating from CGI to mod_perl
847(1)
21.13 Sharing Information Between Handlers
848(1)
21.14 Reloading Changed Modules
849(1)
21.15 Benchmarking a mod_perl Application
850(2)
21.16 Templating with HTML:: Mason
852(4)
21.17 Templating with Template Toolkit
856(7)
22. XML 863(34)
22.1 Parsing XML into Data Structures
871(3)
22.2 Parsing XML into a DOM Tree
874(2)
22.3 Parsing XML into SAX Events
876(3)
22.4 Making Simple Changes to Elements or Text
879(3)
22.5 Validating XML
882(3)
22.6 Finding Elements and Text Within an XML Document
885(2)
22.7 Processing XML Stylesheet Transformations
887(3)
22.8 Processing Files Larger Than Available Memory
890(1)
22.9 Reading and Writing RSS Files
891(4)
22.10 Writing XML
895(2)
Index 897

Supplemental Materials

What is included with this book?

The New copy of this book will include any supplemental materials advertised. Please check the title of the book to determine if it should include any access cards, study guides, lab manuals, CDs, etc.

The Used, Rental and eBook copies of this book are not guaranteed to include any supplemental materials. Typically, only the book itself is included. This is true even if the title states it includes any access cards, study guides, lab manuals, CDs, etc.

Rewards Program