Benchmark: using code refs
[p5sagit/p5-mst-13.2.git] / pod / perlsub.pod
index c83f2da..a38d05b 100644 (file)
@@ -48,8 +48,15 @@ there's really no difference from the language's perspective.)
 Any arguments passed to the routine come in as the array @_.  Thus if you
 called a function with two arguments, those would be stored in C<$_[0]>
 and C<$_[1]>.  The array @_ is a local array, but its values are implicit
-references (predating L<perlref>) to the actual scalar parameters.  The
-return value of the subroutine is the value of the last expression
+references (predating L<perlref>) to the actual scalar parameters.  What
+this means in practice is that when you explicitly modify C<$_[0]> et al.,
+you will be changing the actual arguments.  As a result, all arguments
+to functions are treated as lvalues.  Any hash or array elements that are
+passed to functions will get created if they do not exist (irrespective
+of whether the function does modify the contents of C<@_>).  This is
+frequently a source of surprise.  See L<perltrap> for an example.
+
+The return value of the subroutine is the value of the last expression
 evaluated.  Alternatively, a return statement may be used to specify the
 returned value and exit the subroutine.  If you return one or more arrays
 and/or hashes, these will be flattened together into one large
@@ -608,7 +615,7 @@ If you're planning on generating new filehandles, you could do this:
     sub openit {
        my $name = shift;
        local *FH;
-       return open (FH, $path) ? \*FH : undef;
+       return open (FH, $path) ? *FH : undef;
     } 
 
 Although that will actually produce a small memory leak.  See the bottom