| |
| |
Foreword | |
| |
| |
Preface | |
| |
| |
| |
Introduction | |
| |
| |
What Should You Know Already? | |
| |
| |
strict and warnings | |
| |
| |
Perl v5.14 | |
| |
| |
A Note on Versions | |
| |
| |
What About All Those Footnotes? | |
| |
| |
What's With the Exercises? | |
| |
| |
How to Get Help | |
| |
| |
What If I'm a Perl Course Instructor? | |
| |
| |
Exercises | |
| |
| |
| |
Using Modules | |
| |
| |
The Standard Distribution | |
| |
| |
Exploring CPAN | |
| |
| |
Using Modules | |
| |
| |
Functional Interfaces | |
| |
| |
Selecting What to Import | |
| |
| |
Object-Oriented Interfaces | |
| |
| |
A More Typical Object-Oriented Module: Math::BigInt | |
| |
| |
Fancier Output with Modules | |
| |
| |
What's in Core? | |
| |
| |
The Comprehensive Perl Archive Network | |
| |
| |
Installing Modules from CPAN | |
| |
| |
CPANminus | |
| |
| |
Installing Modules Manually | |
| |
| |
Setting the Path at the Right Time | |
| |
| |
Setting the Path Outside the Program | |
| |
| |
Extending @INC with PERL5LIB | |
| |
| |
Extending @INC on the Command Line | |
| |
| |
local::lib | |
| |
| |
Exercises | |
| |
| |
| |
Intermediate Foundations | |
| |
| |
List Operators | |
| |
| |
List Filtering with grep | |
| |
| |
Transforming Lists with map | |
| |
| |
Trapping Errors with eval | |
| |
| |
Dynamic Code with eval | |
| |
| |
The do Block | |
| |
| |
Exercises | |
| |
| |
| |
Introduction to References | |
| |
| |
Doing the Same Task on Many Arrays | |
| |
| |
PeGS: Perl Graphical Structures | |
| |
| |
Taking a Reference to an Array | |
| |
| |
Dereferencing the Array Reference | |
| |
| |
Getting Our Braces Off | |
| |
| |
Modifying the Array | |
| |
| |
Nested Data Structures | |
| |
| |
Simplifying Nested Element References with Arrows | |
| |
| |
References to Hashes | |
| |
| |
Checking Reference Types | |
| |
| |
Exercises | |
| |
| |
| |
References and Scoping | |
| |
| |
More than One Reference to Data | |
| |
| |
What If That Was the Name? | |
| |
| |
Reference Counting and Nested Data Structures | |
| |
| |
When Reference Counting Goes Bad | |
| |
| |
Creating an Anonymous Array Directly | |
| |
| |
Creating an Anonymous Hash | |
| |
| |
Autovivification | |
| |
| |
Autovivification and Hashes | |
| |
| |
Exercises | |
| |
| |
| |
Manipulating Complex Data Structures | |
| |
| |
Using the Debugger to View Complex Data | |
| |
| |
Viewing Complex Data with Data::Dumper | |
| |
| |
Other Dumpers | |
| |
| |
Marshalling Data | |
| |
| |
Storing Complex Data with Storable | |
| |
| |
YAML | |
| |
| |
JSON | |
| |
| |
Using the map and grep Operators | |
| |
| |
Applying a Bit of Indirection | |
| |
| |
Selecting and Altering Complex Data | |
| |
| |
Exercises | |
| |
| |
| |
Subroutine References | |
| |
| |
Referencing a Named Subroutine | |
| |
| |
Anonymous Subroutines | |
| |
| |
Callbacks | |
| |
| |
Closures | |
| |
| |
Returning a Subroutine from a Subroutine | |
| |
| |
Closure Variables as Inputs | |
| |
| |
Closure Variables as Static Local Variables | |
| |
| |
state Variables | |
| |
| |
Finding Out Who We Are | |
| |
| |
Enchanting Subroutines | |
| |
| |
Dumping Closures | |
| |
| |
Exercise | |
| |
| |
| |
Filehandle References | |
| |
| |
The Old Way | |
| |
| |
The Improved Way | |
| |
| |
Filehandles to Strings | |
| |
| |
Processing Strings Line by Line | |
| |
| |
Collections of Filehandles | |
| |
| |
IO::Handle and Friends | |
| |
| |
IO::File | |
| |
| |
IO::Scalar | |
| |
| |
IO::Tee | |
| |
| |
IO::Pipe | |
| |
| |
IO::Null and IO::Interactive | |
| |
| |
Directory Handles | |
| |
| |
Directory Handle References | |
| |
| |
Exercises | |
| |
| |
| |
Regular Expression References | |
| |
| |
Before Regular Expression References | |
| |
| |
Precompiled Patterns | |
| |
| |
Regular Expression Options | |
| |
| |
Applying Regex References | |
| |
| |
Regexes as Scalars | |
| |
| |
Build Up Regular Expressions | |
| |
| |
Regex-Creating Modules | |
| |
| |
Using Common Patterns | |
| |
| |
Assembling Regular Expressions | |
| |
| |
Exercises | |
| |
| |
| |
Practical Reference Tricks | |
| |
| |
Fancier Sorting | |
| |
| |
Sorting with Indices | |
| |
| |
Sorting Efficiently | |
| |
| |
The Schwartzian Transform | |
| |
| |
Multilevel Sort with the Schwartzian Transform | |
| |
| |
Recursively Defined Data | |
| |
| |
Building Recursively Defined Data | |
| |
| |
Displaying Recursively Defined Data | |
| |
| |
Avoiding Recursion | |
| |
| |
The Breadth-First Solution | |
| |
| |
Exercises | |
| |
| |
| |
Building Larger Programs | |
| |
| |
The Cure for the Common Code | |
| |
| |
Inserting Code with eval | |
| |
| |
Using do | |
| |
| |
Using require | |
| |
| |
The Problem of Namespace Collisions | |
| |
| |
Packages as Namespace Separators | |
| |
| |
Scope of a Package Directive | |
| |
| |
Packages and Lexicals | |
| |
| |
Package Blocks | |
| |
| |
Exercises | |
| |
| |
| |
Creating Your Own Perl Distribution | |
| |
| |
Perl's Two Build Systems | |
| |
| |
Inside Makefile.PL | |
| |
| |
Inside Build.PL | |
| |
| |
Our First Distribution | |
| |
| |
h2xs | |
| |
| |
Module::Starter | |
| |
| |
Custom Templates | |
| |
| |
Inside Your Perl Distribution | |
| |
| |
The META File | |
| |
| |
Adding Additional Modules | |
| |
| |
Inside a Module | |
| |
| |
Plain Ol' Documentation | |
| |
| |
Pod Command Paragraphs | |
| |
| |
Pod Paragraphs | |
| |
| |
Pod Formatting Codes | |
| |
| |
Checking the Pod Format | |
| |
| |
The Module Code | |
| |
| |
Module Building Summary | |
| |
| |
Creating a Module::Build Distribution | |
| |
| |
Creating a ExtUtils::Makemaker Distribution | |
| |
| |
Exercises | |
| |
| |
| |
Introduction to Objects | |
| |
| |
If We Could Talk to the Animals… | |
| |
| |
Introducing the Method Invocation Arrow | |
| |
| |
The Extra Parameter of Method Invocation | |
| |
| |
Calling a Second Method to Simplify Things | |
| |
| |
A Few Notes About @ISA | |
| |
| |
Overriding the Methods | |
| |
| |
Starting the Search from a Different Place | |
| |
| |
The SUPER Way of Doing Things | |
| |
| |
What to Do with @_ | |
| |
| |
Where We Are | |
| |
| |
Our Barnyard Summary | |
| |
| |
Exercises | |
| |
| |
| |
Introduction to Testing | |
| |
| |
Why Should We Test? | |
| |
| |
The Perl Testing Process | |
| |
| |
Test Anywhere Protocol | |
| |
| |
The Art of Testing | |
| |
| |
A Test Example | |
| |
| |
The Test Harness | |
| |
| |
The Standard Tests | |
| |
| |
Checking that Modules Compile | |
| |
| |
The Boilerplate Tests | |
| |
| |
The Pod Tests | |
| |
| |
Adding Our First Tests | |
| |
| |
Measuring Our Test Coverage | |
| |
| |
Subroutine Coverage | |
| |
| |
Statement Coverage | |
| |
| |
Branch Coverage | |
| |
| |
Conditional Coverage | |
| |
| |
Exercises | |
| |
| |
| |
Objects with Data | |
| |
| |
A Horse Is a Horse, of Course of Course-Or Is It? | |
| |
| |
Invoking an Instance Method | |
| |
| |
Accessing the Instance Data | |
| |
| |
How to Build a Horse | |
| |
| |
Inheriting the Constructor | |
| |
| |
Making a Method Work with Either Classes or Instances | |
| |
| |
Adding Parameters to a Method | |
| |
| |
More Interesting Instances | |
| |
| |
A Horse of a Different Color | |
| |
| |
Getting Our Deposit Back | |
| |
| |
Don't Look Inside the Box | |
| |
| |
Faster Getters and Setters | |
| |
| |
Getters that Double as Setters | |
| |
| |
Restricting a Method to Class Only or Instance Only | |
| |
| |
Exercise | |
| |
| |
| |
Some Advanced Object Topics | |
| |
| |
UNIVERSAL Methods | |
| |
| |
Testing Our Objects for Good Behavior | |
| |
| |
The Last Resort | |
| |
| |
Using AUTOLOAD for Accessors | |
| |
| |
Creating Getters and Setters More Easily | |
| |
| |
Multiple Inheritance | |
| |
| |
Exercises | |
| |
| |
| |
Exporter | |
| |
| |
What use Is Doing | |
| |
| |
Importing with Exporter | |
| |
| |
@EXPORT and @EXPORT_OK | |
| |
| |
Grouping with %EXPORT_TAGS | |
| |
| |
Custom Import Routines | |
| |
| |
Exercises | |
| |
| |
| |
Object Destruction | |
| |
| |
Cleaning Up After Ourselves | |
| |
| |
Nested Object Destruction | |
| |
| |
Beating a Dead Horse | |
| |
| |
Indirect Object Notation | |
| |
| |
Additional Instance Variables in Subclasses | |
| |
| |
Using Class Variables | |
| |
| |
Weakening the Argument | |
| |
| |
Exercise | |
| |
| |
| |
Introduction to Moose | |
| |
| |
Making Animals with Moose | |
| |
| |
Roles Instead of Inheritance | |
| |
| |
Default Values | |
| |
| |
Constraining Values | |
| |
| |
Wrapping Methods | |
| |
| |
Read-Only Attributes | |
| |
| |
Improving the Race Horse | |
| |
| |
Further Study | |
| |
| |
Exercises | |
| |
| |
| |
Advancing Testing | |
| |
| |
Skipping Tests | |
| |
| |
Testing Object-Oriented Features | |
| |
| |
Grouping Tests | |
| |
| |
Testing Large Strings | |
| |
| |
Testing Files | |
| |
| |
Testing STDOUT or STDERR | |
| |
| |
Using Mock Objects | |
| |
| |
Writing Our Own Test::* Modules | |
| |
| |
Exercises | |
| |
| |
| |
Contributing to CPAN | |
| |
| |
The Comprehensive Perl Archive Network | |
| |
| |
Getting Prepared | |
| |
| |
How PAUSE Works | |
| |
| |
The Indexer | |
| |
| |
Module Maintainers | |
| |
| |
Before We Start Work | |
| |
| |
Preparing the Distribution | |
| |
| |
Create or Update the README | |
| |
| |
Check the Build File | |
| |
| |
Update the Manifest | |
| |
| |
Increase the Version String | |
| |
| |
Test the Distribution | |
| |
| |
Uploading the Distribution | |
| |
| |
Testing on Multiple Platforms | |
| |
| |
Announcing the Module | |
| |
| |
Exercises | |
| |
| |
Appendix: Answers to Exercises | |
| |
| |
Index of Modules in this Book | |
| |
| |
Index | |