This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Handle state vars correctly in ref assignment
[perl5.git] / pod / perlintro.pod
index 23abd83..77465a1 100644 (file)
@@ -18,15 +18,34 @@ I<strongly> advised to follow this introduction with more information
 from the full Perl manual, the table of contents to which can be found
 in L<perltoc>.
 
-Throughout this document you'll see references to other parts of the 
+Throughout this document you'll see references to other parts of the
 Perl documentation.  You can read that documentation using the C<perldoc>
 command or whatever method you're using to read this document.
 
+Throughout Perl's documentation, you'll find numerous examples intended
+to help explain the discussed features.  Please keep in mind that many
+of them are code fragments rather than complete programs.
+
+These examples often reflect the style and preference of the author of
+that piece of the documentation, and may be briefer than a corresponding
+line of code in a real program.  Except where otherwise noted, you
+should assume that C<use strict> and C<use warnings> statements
+appear earlier in the "program", and that any variables used have
+already been declared, even if those declarations have been omitted
+to make the example easier to read.
+
+Do note that the examples have been written by many different authors over
+a period of several decades.  Styles and techniques will therefore differ,
+although some effort has been made to not vary styles too widely in the
+same sections.  Do not consider one style to be better than others - "There's
+More Than One Way To Do It" is one of Perl's mottos.  After all, in your
+journey as a programmer, you are likely to encounter different styles.
+
 =head2 What is Perl?
 
-Perl is a general-purpose programming language originally developed for 
-text manipulation and now used for a wide range of tasks including 
-system administration, web development, network programming, GUI 
+Perl is a general-purpose programming language originally developed for
+text manipulation and now used for a wide range of tasks including
+system administration, web development, network programming, GUI
 development, and more.
 
 The language is intended to be practical (easy to use, efficient,
@@ -36,8 +55,8 @@ object-oriented (OO) programming, has powerful built-in support for text
 processing, and has one of the world's most impressive collections of
 third-party modules.
 
-Different definitions of Perl are given in L<perl>, L<perlfaq1> and 
-no doubt other places.  From this we can determine that Perl is different 
+Different definitions of Perl are given in L<perl>, L<perlfaq1> and
+no doubt other places.  From this we can determine that Perl is different
 things to different people, but that lots of people think it's at least
 worth writing about.
 
@@ -45,17 +64,37 @@ worth writing about.
 
 To run a Perl program from the Unix command line:
 
   perl progname.pl
+ perl progname.pl
 
 Alternatively, put this as the first line of your script:
 
   #!/usr/bin/env perl
+ #!/usr/bin/env perl
 
-... and run the script as C</path/to/script.pl>.  Of course, it'll need
+... and run the script as F</path/to/script.pl>.  Of course, it'll need
 to be executable first, so C<chmod 755 script.pl> (under Unix).
 
+(This start line assumes you have the B<env> program.  You can also put
+directly the path to your perl executable, like in C<#!/usr/bin/perl>).
+
 For more information, including instructions for other platforms such as
-Windows and MacOS, read L<perlrun>.
+Windows and Mac OS, read L<perlrun>.
+
+=head2 Safety net
+
+Perl by default is very forgiving.  In order to make it more robust
+it is recommended to start every program with the following lines:
+
+ #!/usr/bin/perl
+ use strict;
+ use warnings;
+
+The two additional lines request from perl to catch various common
+problems in your code.  They check different things so you need both.  A
+potential problem caught by C<use strict;> will cause your code to stop
+immediately when it is encountered, while C<use warnings;> will merely
+give a warning (like the command-line switch B<-w>) and let your code run.
+To read more about them check their respective manual pages at L<strict>
+and L<warnings>.
 
 =head2 Basic syntax overview
 
@@ -66,45 +105,45 @@ that kind.
 
 Perl statements end in a semi-colon:
 
   print "Hello, world";
+ print "Hello, world";
 
 Comments start with a hash symbol and run to the end of the line
 
   # This is a comment
+ # This is a comment
 
 Whitespace is irrelevant:
 
-    print 
-        "Hello, world"
-        ;
+ print
+     "Hello, world"
+     ;
 
 ... except inside quoted strings:
 
   # this would print with a linebreak in the middle
   print "Hello
   world";
+ # this would print with a linebreak in the middle
+ print "Hello
+ world";
 
 Double quotes or single quotes may be used around literal strings:
 
   print "Hello, world";
   print 'Hello, world';
+ print "Hello, world";
+ print 'Hello, world';
 
 However, only double quotes "interpolate" variables and special
 characters such as newlines (C<\n>):
 
   print "Hello, $name\n";     # works fine
   print 'Hello, $name\n';     # prints $name\n literally
+ print "Hello, $name\n";     # works fine
+ print 'Hello, $name\n';     # prints $name\n literally
 
 Numbers don't need quotes around them:
 
   print 42;
+ print 42;
 
 You can use parentheses for functions' arguments or omit them
-according to your personal taste.  They are only required 
+according to your personal taste.  They are only required
 occasionally to clarify issues of precedence.
 
   print("Hello, world\n");
   print "Hello, world\n";
+ print("Hello, world\n");
+ print "Hello, world\n";
 
 More detailed information about Perl syntax can be found in L<perlsyn>.
 
@@ -118,69 +157,71 @@ Perl has three main variable types: scalars, arrays, and hashes.
 
 A scalar represents a single value:
 
   my $animal = "camel";
   my $answer = 42;
+ my $animal = "camel";
+ my $answer = 42;
 
-Scalar values can be strings, integers or floating point numbers, and Perl 
-will automatically convert between them as required.  There is no need 
-to pre-declare your variable types.
+Scalar values can be strings, integers or floating point numbers, and Perl
+will automatically convert between them as required.  There is no need
+to pre-declare your variable types, but you have to declare them using
+the C<my> keyword the first time you use them.  (This is one of the
+requirements of C<use strict;>.)
 
 Scalar values can be used in various ways:
 
   print $animal;
   print "The animal is $animal\n";
   print "The square of $answer is ", $answer * $answer, "\n";
+ print $animal;
+ print "The animal is $animal\n";
+ print "The square of $answer is ", $answer * $answer, "\n";
 
 There are a number of "magic" scalars with names that look like
 punctuation or line noise.  These special variables are used for all
 kinds of purposes, and are documented in L<perlvar>.  The only one you
 need to know about for now is C<$_> which is the "default variable".
 It's used as the default argument to a number of functions in Perl, and
-it's set implicitly by certain looping constructs.  
+it's set implicitly by certain looping constructs.
 
   print;          # prints contents of $_ by default
+ print;          # prints contents of $_ by default
 
 =item Arrays
 
 An array represents a list of values:
 
   my @animals = ("camel", "llama", "owl");
   my @numbers = (23, 42, 69);
   my @mixed   = ("camel", 42, 1.23);
+ my @animals = ("camel", "llama", "owl");
+ my @numbers = (23, 42, 69);
+ my @mixed   = ("camel", 42, 1.23);
 
 Arrays are zero-indexed.  Here's how you get at elements in an array:
 
   print $animals[0];              # prints "camel"
   print $animals[1];              # prints "llama"
+ print $animals[0];              # prints "camel"
+ print $animals[1];              # prints "llama"
 
-The special variable C<$#array> tells you the index of the last element 
+The special variable C<$#array> tells you the index of the last element
 of an array:
 
   print $mixed[$#mixed];       # last element, prints 1.23
+ print $mixed[$#mixed];       # last element, prints 1.23
 
-You might be tempted to use C<$#array + 1> to tell you how many items there 
+You might be tempted to use C<$#array + 1> to tell you how many items there
 are in an array.  Don't bother.  As it happens, using C<@array> where Perl
 expects to find a scalar value ("in scalar context") will give you the number
 of elements in the array:
 
   if (@animals < 5) { ... }
+ if (@animals < 5) { ... }
 
-The elements we're getting from the array start with a C<$> because 
-we're getting just a single value out of the array -- you ask for a scalar, 
+The elements we're getting from the array start with a C<$> because
+we're getting just a single value out of the array; you ask for a scalar,
 you get a scalar.
 
-To get multiple values from a array:
+To get multiple values from an array:
 
   @animals[0,1];                  # gives ("camel", "llama");
   @animals[0..2];                 # gives ("camel", "llama", "owl");
   @animals[1..$#animals];         # gives all except the first element
@animals[0,1];                 # gives ("camel", "llama");
@animals[0..2];                # gives ("camel", "llama", "owl");
@animals[1..$#animals];        # gives all except the first element
 
 This is called an "array slice".
 
 You can do various useful things to lists:
 
   my @sorted    = sort @animals;
   my @backwards = reverse @numbers;
+ my @sorted    = sort @animals;
+ my @backwards = reverse @numbers;
 
 There are a couple of special arrays too, such as C<@ARGV> (the command
 line arguments to your script) and C<@_> (the arguments passed to a
@@ -190,30 +231,30 @@ subroutine).  These are documented in L<perlvar>.
 
 A hash represents a set of key/value pairs:
 
   my %fruit_color = ("apple", "red", "banana", "yellow");
+ my %fruit_color = ("apple", "red", "banana", "yellow");
 
 You can use whitespace and the C<< => >> operator to lay them out more
 nicely:
 
   my %fruit_color = (
-        apple  => "red",
-        banana => "yellow",
   );
+ my %fruit_color = (
+     apple  => "red",
+     banana => "yellow",
+ );
 
 To get at hash elements:
 
   $fruit_color{"apple"};           # gives "red"
+ $fruit_color{"apple"};           # gives "red"
 
 You can get at lists of keys and values with C<keys()> and
 C<values()>.
 
   my @fruits = keys %fruit_colors;
   my @colors = values %fruit_colors;
+ my @fruits = keys %fruit_colors;
+ my @colors = values %fruit_colors;
 
 Hashes have no particular internal order, though you can sort the keys
 and loop through them.
 
-Just like special scalars and arrays, there are also special hashes.  
+Just like special scalars and arrays, there are also special hashes.
 The most well known of these is C<%ENV> which contains environment
 variables.  Read all about it (and other special variables) in
 L<perlvar>.
@@ -226,27 +267,27 @@ More complex data types can be constructed using references, which allow
 you to build lists and hashes within lists and hashes.
 
 A reference is a scalar value and can refer to any other Perl data
-type. So by storing a reference as the value of an array or hash
-element, you can easily create lists and hashes within lists and    
-hashes. The following example shows a 2 level hash of hash
+type.  So by storing a reference as the value of an array or hash
+element, you can easily create lists and hashes within lists and
+hashes.  The following example shows a 2 level hash of hash
 structure using anonymous hash references.
 
   my $variables = {
-        scalar  =>  { 
-                     description => "single item",
-                     sigil => '$',
-                    },
-        array   =>  {
-                     description => "ordered list of items",
-                     sigil => '@',
-                    },
-        hash    =>  {
-                     description => "key/value pairs",
-                     sigil => '%',
-                    },
   };
-
   print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";
+ my $variables = {
+     scalar  =>  {
+                  description => "single item",
+                  sigil => '$',
+                 },
+     array   =>  {
+                  description => "ordered list of items",
+                  sigil => '@',
+                 },
+     hash    =>  {
+                  description => "key/value pairs",
+                  sigil => '%',
+                 },
+ };
+
+ print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";
 
 Exhaustive information on the topic of references can be found in
 L<perlreftut>, L<perllol>, L<perlref> and L<perldsc>.
@@ -255,11 +296,11 @@ L<perlreftut>, L<perllol>, L<perlref> and L<perldsc>.
 
 Throughout the previous section all the examples have used the syntax:
 
   my $var = "value";
+ my $var = "value";
 
 The C<my> is actually not required; you could just use:
 
   $var = "value";
+ $var = "value";
 
 However, the above usage will create global variables throughout your
 program, which is bad programming practice.  C<my> creates lexically
@@ -267,102 +308,107 @@ scoped variables instead.  The variables are scoped to the block
 (i.e. a bunch of statements surrounded by curly-braces) in which they
 are defined.
 
-    my $a = "foo";
-    if ($some_condition) {
-        my $b = "bar";
-        print $a;           # prints "foo"
-        print $b;           # prints "bar"
-    }
-    print $a;               # prints "foo"
-    print $b;               # prints nothing; $b has fallen out of scope
+ my $x = "foo";
+ my $some_condition = 1;
+ if ($some_condition) {
+     my $y = "bar";
+     print $x;           # prints "foo"
+     print $y;           # prints "bar"
+ }
+ print $x;               # prints "foo"
+ print $y;               # prints nothing; $y has fallen out of scope
 
 Using C<my> in combination with a C<use strict;> at the top of
-your Perl scripts means that the interpreter will pick up certain common 
+your Perl scripts means that the interpreter will pick up certain common
 programming errors.  For instance, in the example above, the final
-C<print $b> would cause a compile-time error and prevent you from
+C<print $y> would cause a compile-time error and prevent you from
 running the program.  Using C<strict> is highly recommended.
 
 =head2 Conditional and looping constructs
 
-Perl has most of the usual conditional and looping constructs except for
-case/switch (but if you really want it, there is a Switch module in Perl
-5.8 and newer, and on CPAN. See the section on modules, below, for more
-information about modules and CPAN).
+Perl has most of the usual conditional and looping constructs.  As of Perl
+5.10, it even has a case/switch statement (spelled C<given>/C<when>).  See
+L<perlsyn/"Switch Statements"> for more details.
 
 The conditions can be any Perl expression.  See the list of operators in
-the next section for information on comparison and boolean logic operators, 
+the next section for information on comparison and boolean logic operators,
 which are commonly used in conditional statements.
 
 =over 4
 
 =item if
 
   if ( condition ) {
-        ...
   } elsif ( other condition ) {
-        ...
   } else {
-        ...
   }
+ if ( condition ) {
+     ...
+ } elsif ( other condition ) {
+     ...
+ } else {
+     ...
+ }
 
 There's also a negated version of it:
 
   unless ( condition ) {
-        ...
   }
+ unless ( condition ) {
+     ...
+ }
 
-This is provided as a more readable version of C<if (! condition)>.
+This is provided as a more readable version of C<if (!I<condition>)>.
 
 Note that the braces are required in Perl, even if you've only got one
 line in the block.  However, there is a clever way of making your one-line
 conditional blocks more English like:
 
   # the traditional way
   if ($zippy) {
-        print "Yow!";
   }
+ # the traditional way
+ if ($zippy) {
+     print "Yow!";
+ }
 
   # the Perlish post-condition way
   print "Yow!" if $zippy;
   print "We have no bananas" unless $bananas;
+ # the Perlish post-condition way
+ print "Yow!" if $zippy;
+ print "We have no bananas" unless $bananas;
 
 =item while
 
   while ( condition ) {
-        ...
   }
+ while ( condition ) {
+     ...
+ }
 
 There's also a negated version, for the same reason we have C<unless>:
 
   until ( condition ) {
-        ...
   }
+ until ( condition ) {
+     ...
+ }
 
 You can also use C<while> in a post-condition:
 
   print "LA LA LA\n" while 1;          # loops forever
+ print "LA LA LA\n" while 1;          # loops forever
 
 =item for
 
 Exactly like C:
 
   for ($i=0; $i <= $max; $i++) {
-        ...
   }
for ($i = 0; $i <= $max; $i++) {
+     ...
+ }
 
 The C style for loop is rarely needed in Perl since Perl provides
-the the more friendly list scanning C<foreach> loop.
+the more friendly list scanning C<foreach> loop.
 
 =item foreach
 
   foreach (@array) {
-        print "This element is $_\n";
   }
+ foreach (@array) {
+     print "This element is $_\n";
+ }
 
-    # you don't have to use the default $_ either...
-    foreach my $key (keys %hash) {
-        print "The value of $key is $hash{$key}\n";
-    }
+ print $list[$_] foreach 0 .. $max;
+
+ # you don't have to use the default $_ either...
+ foreach my $key (keys %hash) {
+     print "The value of $key is $hash{$key}\n";
+ }
+
+The C<foreach> keyword is actually a synonym for the C<for>
+keyword.  See C<L<perlsyn/"Foreach Loops">>.
 
 =back
 
@@ -373,8 +419,8 @@ this overview) see L<perlsyn>.
 
 Perl comes with a wide selection of builtin functions.  Some of the ones
 we've already seen include C<print>, C<sort> and C<reverse>.  A list of
-them is given at the start of L<perlfunc> and you can easily read 
-about any given function by using C<perldoc -f functionname>.
+them is given at the start of L<perlfunc> and you can easily read
+about any given function by using C<perldoc -f I<functionname>>.
 
 Perl operators are documented in full in L<perlop>, but here are a few
 of the most common ones:
@@ -383,101 +429,101 @@ of the most common ones:
 
 =item Arithmetic
 
   +   addition
   -   subtraction
   *   multiplication
   /   division
+ +   addition
+ -   subtraction
+ *   multiplication
+ /   division
 
 =item Numeric comparison
 
   ==  equality
   !=  inequality
   <   less than
   >   greater than
   <=  less than or equal
   >=  greater than or equal
+ ==  equality
+ !=  inequality
+ <   less than
+ >   greater than
+ <=  less than or equal
+ >=  greater than or equal
 
 =item String comparison
 
   eq  equality
   ne  inequality
   lt  less than
   gt  greater than
   le  less than or equal
   ge  greater than or equal
+ eq  equality
+ ne  inequality
+ lt  less than
+ gt  greater than
+ le  less than or equal
+ ge  greater than or equal
 
-(Why do we have separate numeric and string comparisons?  Because we don't 
-have special variable types, and Perl needs to know whether to sort 
+(Why do we have separate numeric and string comparisons?  Because we don't
+have special variable types, and Perl needs to know whether to sort
 numerically (where 99 is less than 100) or alphabetically (where 100 comes
 before 99).
 
 =item Boolean logic
 
   &&  and
   ||  or
   !   not
+ &&  and
+ ||  or
+ !   not
 
-(C<and>, C<or> and C<not> aren't just in the above table as descriptions 
-of the operators -- they're also supported as operators in their own
-right.  They're more readable than the C-style operators, but have 
-different precedence to C<&&> and friends.  Check L<perlop> for more 
+(C<and>, C<or> and C<not> aren't just in the above table as descriptions
+of the operators.  They're also supported as operators in their own
+right.  They're more readable than the C-style operators, but have
+different precedence to C<&&> and friends.  Check L<perlop> for more
 detail.)
 
 =item Miscellaneous
 
   =   assignment
   .   string concatenation
   x   string multiplication
   ..  range operator (creates a list of numbers)
+ =   assignment
+ .   string concatenation
+ x   string multiplication
+ ..  range operator (creates a list of numbers)
 
 =back
 
 Many operators can be combined with a C<=> as follows:
 
   $a += 1;        # same as $a = $a + 1
   $a -= 1;        # same as $a = $a - 1
   $a .= "\n";     # same as $a = $a . "\n";
+ $a += 1;        # same as $a = $a + 1
+ $a -= 1;        # same as $a = $a - 1
+ $a .= "\n";     # same as $a = $a . "\n";
 
 =head2 Files and I/O
 
 You can open a file for input or output using the C<open()> function.
-It's documented in extravagant detail in L<perlfunc> and L<perlopentut>, 
+It's documented in extravagant detail in L<perlfunc> and L<perlopentut>,
 but in short:
 
   open(INFILE,  "input.txt")   or die "Can't open input.txt: $!";
   open(OUTFILE, ">output.txt") or die "Can't open output.txt: $!";
   open(LOGFILE, ">>my.log")    or die "Can't open logfile: $!";
open(my $in,  "<",  "input.txt")  or die "Can't open input.txt: $!";
open(my $out, ">",  "output.txt") or die "Can't open output.txt: $!";
open(my $log, ">>", "my.log")     or die "Can't open my.log: $!";
 
 You can read from an open filehandle using the C<< <> >> operator.  In
 scalar context it reads a single line from the filehandle, and in list
 context it reads the whole file in, assigning each line to an element of
 the list:
 
   my $line  = <INFILE>;
   my @lines = <INFILE>;
my $line  = <$in>;
my @lines = <$in>;
 
-Reading in the whole file at one time is called slurping. It can
-be useful but it may be a memory hog. Most text file processing
+Reading in the whole file at one time is called slurping.  It can
+be useful but it may be a memory hog.  Most text file processing
 can be done a line at a time with Perl's looping constructs.
 
 The C<< <> >> operator is most often seen in a C<while> loop:
 
-    while (<INFILE>) {     # assigns each line in turn to $_ 
-        print "Just read in this line: $_";
   }
+ while (<$in>) {     # assigns each line in turn to $_
+     print "Just read in this line: $_";
+ }
 
 We've already seen how to print to standard output using C<print()>.
 However, C<print()> can also take an optional first argument specifying
 which filehandle to print to:
 
   print STDERR "This is your final warning.\n";
   print OUTFILE $record;
   print LOGFILE $logmessage;
+ print STDERR "This is your final warning.\n";
print $out $record;
print $log $logmessage;
 
 When you're done with your filehandles, you should C<close()> them
 (though to be honest, Perl will clean up after you if you forget):
 
   close INFILE;
close $in or die "$in: $!";
 
 =head2 Regular expressions
 
@@ -489,8 +535,8 @@ elsewhere.  However, in short:
 
 =item Simple matching
 
   if (/foo/)       { ... }  # true if $_ contains "foo"
   if ($a =~ /foo/) { ... }  # true if $a contains "foo"
+ if (/foo/)       { ... }  # true if $_ contains "foo"
+ if ($a =~ /foo/) { ... }  # true if $a contains "foo"
 
 The C<//> matching operator is documented in L<perlop>.  It operates on
 C<$_> by default, or can be bound to another variable using the C<=~>
@@ -498,9 +544,10 @@ binding operator (also documented in L<perlop>).
 
 =item Simple substitution
 
-    s/foo/bar/;               # replaces foo with bar in $_
-    $a =~ s/foo/bar/;         # replaces foo with bar in $a
-    $a =~ s/foo/bar/g;        # replaces ALL INSTANCES of foo with bar in $a
+ s/foo/bar/;               # replaces foo with bar in $_
+ $a =~ s/foo/bar/;         # replaces foo with bar in $a
+ $a =~ s/foo/bar/g;        # replaces ALL INSTANCES of foo with bar
+                           # in $a
 
 The C<s///> substitution operator is documented in L<perlop>.
 
@@ -511,59 +558,62 @@ on just about anything you could dream of by using more complex regular
 expressions.  These are documented at great length in L<perlre>, but for
 the meantime, here's a quick cheat sheet:
 
-    .                   a single character
-    \s                  a whitespace character (space, tab, newline)
-    \S                  non-whitespace character
-    \d                  a digit (0-9)
-    \D                  a non-digit
-    \w                  a word character (a-z, A-Z, 0-9, _)
-    \W                  a non-word character
-    [aeiou]             matches a single character in the given set
-    [^aeiou]            matches a single character outside the given set
-    (foo|bar|baz)       matches any of the alternatives specified
-
-    ^                   start of string
-    $                   end of string
-
-Quantifiers can be used to specify how many of the previous thing you 
-want to match on, where "thing" means either a literal character, one 
-of the metacharacters listed above, or a group of characters or 
+ .                   a single character
+ \s                  a whitespace character (space, tab, newline,
+                     ...)
+ \S                  non-whitespace character
+ \d                  a digit (0-9)
+ \D                  a non-digit
+ \w                  a word character (a-z, A-Z, 0-9, _)
+ \W                  a non-word character
+ [aeiou]             matches a single character in the given set
+ [^aeiou]            matches a single character outside the given
+                     set
+ (foo|bar|baz)       matches any of the alternatives specified
+
+ ^                   start of string
+ $                   end of string
+
+Quantifiers can be used to specify how many of the previous thing you
+want to match on, where "thing" means either a literal character, one
+of the metacharacters listed above, or a group of characters or
 metacharacters in parentheses.
 
   *                   zero or more of the previous thing
   +                   one or more of the previous thing
   ?                   zero or one of the previous thing
   {3}                 matches exactly 3 of the previous thing
   {3,6}               matches between 3 and 6 of the previous thing
   {3,}                matches 3 or more of the previous thing
+ *                   zero or more of the previous thing
+ +                   one or more of the previous thing
+ ?                   zero or one of the previous thing
+ {3}                 matches exactly 3 of the previous thing
+ {3,6}               matches between 3 and 6 of the previous thing
+ {3,}                matches 3 or more of the previous thing
 
 Some brief examples:
 
-    /^\d+/              string starts with one or more digits
-    /^$/                nothing in the string (start and end are adjacent)
-    /(\d\s){3}/         a three digits, each followed by a whitespace 
-                        character (eg "3 4 5 ")
-    /(a.)+/             matches a string in which every odd-numbered letter 
-                        is a (eg "abacadaf")
+ /^\d+/              string starts with one or more digits
+ /^$/                nothing in the string (start and end are
+                     adjacent)
+ /(\d\s){3}/         three digits, each followed by a whitespace
+                     character (eg "3 4 5 ")
+ /(a.)+/             matches a string in which every odd-numbered
+                     letter is a (eg "abacadaf")
 
   # This loop reads from STDIN, and prints non-blank lines:
   while (<>) {
-        next if /^$/;
-        print;
   }
+ # This loop reads from STDIN, and prints non-blank lines:
+ while (<>) {
+     next if /^$/;
+     print;
+ }
 
 =item Parentheses for capturing
 
-As well as grouping, parentheses serve a second purpose.  They can be 
+As well as grouping, parentheses serve a second purpose.  They can be
 used to capture the results of parts of the regexp match for later use.
 The results end up in C<$1>, C<$2> and so on.
 
   # a cheap and nasty way to break an email address up into parts
+ # a cheap and nasty way to break an email address up into parts
 
   if ($email =~ /([^@]+@(.+)/) {
-        print "Username is $1\n";
-        print "Hostname is $2\n";
   }
if ($email =~ /([^@]+)@(.+)/) {
+     print "Username is $1\n";
+     print "Hostname is $2\n";
+ }
 
 =item Other regexp features
 
@@ -577,29 +627,38 @@ L<perlretut>, and L<perlre>.
 
 Writing subroutines is easy:
 
-    sub log {
-        my $logmessage = shift;
-        print LOGFILE $logmessage;
-    }
+ sub logger {
+    my $logmessage = shift;
+    open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";
+    print $logfile $logmessage;
+ }
+
+Now we can use the subroutine just as any other built-in function:
+
+ logger("We have a logger subroutine!");
 
 What's that C<shift>?  Well, the arguments to a subroutine are available
 to us as a special array called C<@_> (see L<perlvar> for more on that).
 The default argument to the C<shift> function just happens to be C<@_>.
 So C<my $logmessage = shift;> shifts the first item off the list of
-arguments and assigns it to C<$logmessage>. 
+arguments and assigns it to C<$logmessage>.
 
 We can manipulate C<@_> in other ways too:
 
   my ($logmessage, $priority) = @_;       # common
   my $logmessage = $_[0];                 # uncommon, and ugly
+ my ($logmessage, $priority) = @_;       # common
+ my $logmessage = $_[0];                 # uncommon, and ugly
 
 Subroutines can also return values:
 
-    sub square {
-        my $num = shift;
-        my $result = $num * $num;
-        return $result;
-    }
+ sub square {
+     my $num = shift;
+     my $result = $num * $num;
+     return $result;
+ }
+
+Then use it like:
+
+ $sq = square(8);
 
 For more information on writing subroutines, see L<perlsub>.
 
@@ -607,8 +666,8 @@ For more information on writing subroutines, see L<perlsub>.
 
 OO Perl is relatively simple and is implemented using references which
 know what sort of object they are based on Perl's concept of packages.
-However, OO Perl is largely beyond the scope of this document.  
-Read L<perlboot>, L<perltoot>, L<perltooc> and L<perlobj>.
+However, OO Perl is largely beyond the scope of this document.
+Read L<perlootut> and L<perlobj>.
 
 As a beginning Perl programmer, your most common use of OO Perl will be
 in using third-party modules, which are documented below.
@@ -616,7 +675,7 @@ in using third-party modules, which are documented below.
 =head2 Using Perl modules
 
 Perl modules provide a range of features to help you avoid reinventing
-the wheel, and can be downloaded from CPAN (http://www.cpan.org).  A
+the wheel, and can be downloaded from CPAN ( http://www.cpan.org/ ).  A
 number of popular modules are included with the Perl distribution
 itself.
 
@@ -625,11 +684,11 @@ to database integration to graphics.  A categorized list of modules is
 also available from CPAN.
 
 To learn how to install modules you download from CPAN, read
-L<perlmodinstall>
+L<perlmodinstall>.
 
-To learn how to use a particular module, use C<perldoc Module::Name>.
-Typically you will want to C<use Module::Name>, which will then give you
-access to exported functions or an OO interface to the module.
+To learn how to use a particular module, use C<perldoc I<Module::Name>>.
+Typically you will want to C<use I<Module::Name>>, which will then give
+you access to exported functions or an OO interface to the module.
 
 L<perlfaq> contains questions and answers related to many common
 tasks, and often provides suggestions for good CPAN modules to use.