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
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