X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlsub.pod;h=74d0b1ac26fed091d13a05a0fbfd40c241606d29;hb=6702284617d8c80196d105d0d999663377cec94b;hp=969d0ba0392b3cabf074bd30b6ea97b531c848da;hpb=ac90fb77766c098cd9f3441aa6691af8456d9c52;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlsub.pod b/pod/perlsub.pod index 969d0ba..74d0b1a 100644 --- a/pod/perlsub.pod +++ b/pod/perlsub.pod @@ -1,10 +1,12 @@ =head1 NAME +X X perlsub - Perl subroutines =head1 SYNOPSIS To declare subroutines: +X X sub NAME; # A "forward" declaration. sub NAME(PROTO); # ditto, but with prototypes @@ -17,6 +19,7 @@ To declare subroutines: sub NAME(PROTO) : ATTRS BLOCK # with prototypes and attributes To define an anonymous subroutine at runtime: +X $subref = sub BLOCK; # no proto $subref = sub (PROTO) BLOCK; # with proto @@ -24,10 +27,12 @@ To define an anonymous subroutine at runtime: $subref = sub (PROTO) : ATTRS BLOCK; # with proto and attributes To import subroutines: +X use MODULE qw(NAME1 NAME2 NAME3); To call subroutines: +X X NAME(LIST); # & is optional with parentheses. NAME LIST; # Parentheses optional if predeclared/imported. @@ -52,6 +57,7 @@ pass-by-reference instead to avoid this. Both call and return lists may contain as many or as few scalar elements as you'd like. (Often a function without an explicit return statement is called a subroutine, but there's really no difference from Perl's perspective.) +X X Any arguments passed in show up in the array C<@_>. Therefore, if you called a function with two arguments, those would be stored in @@ -65,16 +71,22 @@ or a reference to it is taken. (Some earlier versions of Perl created the element whether or not the element was assigned to.) Assigning to the whole array C<@_> removes that aliasing, and does not update any arguments. - -The return value of a subroutine is the value of the last expression -evaluated. More explicitly, a C statement may be used to exit the -subroutine, optionally specifying the returned value, which will be -evaluated in the appropriate context (list, scalar, or void) depending -on the context of the subroutine call. If you specify no return value, -the subroutine returns an empty list in list context, the undefined -value in scalar context, or nothing in void context. If you return -one or more aggregates (arrays and hashes), these will be flattened -together into one large indistinguishable list. +X X X<@_> + +A C statement may be used to exit a subroutine, optionally +specifying the returned value, which will be evaluated in the +appropriate context (list, scalar, or void) depending on the context of +the subroutine call. If you specify no return value, the subroutine +returns an empty list in list context, the undefined value in scalar +context, or nothing in void context. If you return one or more +aggregates (arrays and hashes), these will be flattened together into +one large indistinguishable list. + +If no C is found and if the last statement is an expression, its +value is returned. If the last statement is a loop control structure +like a C or a C, the returned value is unspecified. The +empty sub returns the empty list. +X X X Perl does not have named formal parameters. In practice all you do is assign to a C list of these. Variables that aren't @@ -83,6 +95,7 @@ on creating private variables, see L<"Private Variables via my()"> and L<"Temporary Values via local()">. To create protected environments for a set of functions in a separate package (and probably a separate file), see L. +X X Example: @@ -129,6 +142,7 @@ Because the assignment copies the values, this also has the effect of turning call-by-reference into call-by-value. Otherwise a function is free to do in-place modifications of C<@_> and change its caller's values. +X X upcase_in($v1, $v2); # this changes $v1 and $v2 sub upcase_in { @@ -138,6 +152,7 @@ its caller's values. You aren't allowed to modify constants in this way, of course. If an argument were actually literal and you tried to change it, you'd take a (presumably fatal) exception. For example, this won't work: +X X upcase_in("frederick"); @@ -181,12 +196,14 @@ want to do an indirect subroutine call with a subroutine name or reference using the C<&$subref()> or C<&{$subref}()> constructs, although the C<< $subref->() >> notation solves that problem. See L for more about all that. +X<&> Subroutines may be called recursively. If a subroutine is called using the C<&> form, the argument list is optional, and if omitted, no C<@_> array is set up for the subroutine: the C<@_> array at the time of the call is visible to subroutine instead. This is an efficiency mechanism that new users may wish to avoid. +X &foo(1,2,3); # pass three arguments foo(1,2,3); # the same @@ -201,6 +218,7 @@ Not only does the C<&> form make the argument list optional, it also disables any prototype checking on arguments you do provide. This is partly for historical reasons, and partly for having a convenient way to cheat if you know what you're doing. See L below. +X<&> Subroutines whose names are in all upper case are reserved to the Perl core, as are modules whose names are in all lower case. A subroutine in @@ -209,12 +227,14 @@ indirectly by the run-time system itself, usually due to a triggered event. Subroutines that do special, pre-defined things include C, C, C plus all functions mentioned in L and L. -The C, C, C and C subroutines are not so much -subroutines as named special code blocks, of which you can have more -than one in a package, and which you can B call explicitely. See -L +The C, C, C, C and C subroutines +are not so much subroutines as named special code blocks, of which you +can have more than one in a package, and which you can B call +explicitly. See L =head2 Private Variables via my() +X X X X X +X X Synopsis: @@ -242,6 +262,7 @@ variables declared with C are totally hidden from the outside world, including any called subroutines. This is true if it's the same subroutine called from itself or elsewhere--every call gets its own copy. +X This doesn't mean that a C variable declared in a statically enclosing lexical scope would be invisible. Only dynamic scopes @@ -255,6 +276,7 @@ occurred at the same scope, presumably file scope. An C, however, can see lexical variables of the scope it is being evaluated in, so long as the names aren't hidden by declarations within the C itself. See L. +X The parameter list to my() may be assigned to if desired, which allows you to initialize your variables. (If no initializer is given for a @@ -337,6 +359,7 @@ in the manner of C. However, if the index variable is prefixed with the keyword C, or if there is already a lexical by that name in scope, then a new lexical is created instead. Thus in the loop +X X for my $i (1, 2, 3) { some_function(); @@ -344,6 +367,7 @@ in the loop the scope of $i extends to the end of the loop, but not beyond it, rendering the value of $i inaccessible within C. +X X Some users may wish to encourage the use of lexically scoped variables. As an aid to catching implicit uses to package variables, @@ -370,7 +394,6 @@ never fully qualified with the package name. In particular, you're not allowed to try to make a package variable (or other global) lexical: my $pack::var; # ERROR! Illegal syntax - my $_; # also illegal (currently) In fact, a dynamic variable (also known as package or global variables) are still accessible using the fully qualified C<::> notation even while a @@ -408,6 +431,34 @@ L for something of a work-around to this. =head2 Persistent Private Variables +X X X X X X + +There are two ways to build persistent private variables in Perl 5.10. +First, you can simply use the C feature. Or, you can use closures, +if you want to stay compatible with releases older than 5.10. + +=head3 Persistent variables via state() + +Beginning with perl 5.9.4, you can declare variables with the C +keyword in place of C. For that to work, though, you must have +enabled that feature beforehand, either by using the C pragma, or +by using C<-E> on one-liners. (see L) + +For example, the following code maintains a private counter, incremented +each time the gimme_another() function is called: + + use feature 'state'; + sub gimme_another { state $x; return ++$x } + +Also, since C<$x> is lexical, it can't be reached or modified by any Perl +code outside. + +When combined with variable declaration, simple scalar assignment to C +variables (as in C) is executed only the first time. When such +statements are evaluated subsequent times, the assignment is ignored. The +behavior of this sort of assignment to non-scalar variables is undefined. + +=head3 Persistent variables with closures Just because a lexical variable is lexically (also called statically) scoped to its enclosing block, C, or C FILE, this doesn't mean that @@ -454,8 +505,9 @@ starts to run: } } -See L about the -special triggered code blocks, C, C, C and C. +See L about the +special triggered code blocks, C, C, C, +C and C. If declared at the outermost scope (the file scope), then lexicals work somewhat like C's file statics. They are available to all @@ -464,6 +516,8 @@ from outside that file. This strategy is sometimes used in modules to create private variables that the whole module can see. =head2 Temporary Values via local() +X X X X +X B: In general, you should be using C instead of C, because it's faster and safer. Exceptions to this include the global punctuation @@ -519,6 +573,7 @@ through a loop. Consequently, it's more efficient to localize your variables outside the loop. =head3 Grammatical note on local() +X A C is simply a modifier on an lvalue expression. When you assign to a Cized variable, the C doesn't change whether its list is viewed @@ -534,6 +589,7 @@ both supply a list context to the right-hand side, while supplies a scalar context. =head3 Localization of special variables +X If you localize a special variable, you'll be giving a new value to it, but its magic won't go away. That means that all side-effects related @@ -569,8 +625,10 @@ code that relies on any particular behaviour of localising tied arrays or hashes (localising individual elements is still okay). See L for more details. +X =head3 Localization of globs +X X The construct @@ -588,8 +646,11 @@ separator. Notably, if you want to work with a brand new value of the default scalar $_, and avoid the potential problem listed above about $_ previously carrying a magic value, you should use C instead of C. +As of perl 5.9.1, you can also use the lexical form of C<$_> (declaring it +with C), which avoids completely this problem. =head3 Localization of elements of composite types +X X X It's also worth taking a moment to explain what happens when you Cize a member of a composite type (i.e. an array or hash element). @@ -632,6 +693,7 @@ The behavior of local() on non-existent members of composite types is subject to change in future. =head2 Lvalue subroutines +X X B: Lvalue subroutines are still experimental and the implementation may change in future versions of Perl. @@ -701,6 +763,7 @@ subroutine never gets that chance. Consider; =back =head2 Passing Symbol Table Entries (typeglobs) +X X<*> B: The mechanism described in this section was originally the only way to simulate pass-by-reference in older versions of @@ -743,6 +806,7 @@ the individual arrays. For more on typeglobs, see L. =head2 When to Still Use local() +X X Despite the existence of C, there are still three places where the C operator still shines. In fact, in these three places, you @@ -820,6 +884,7 @@ this operation could on occasion misbehave. =back =head2 Pass by Reference +X X X If you want to pass more than one array or hash into a function--or return them from it--and have them maintain their integrity, then @@ -933,6 +998,7 @@ Notice to pass back just the bare *FH, not its reference. } =head2 Prototypes +X X Perl supports a very limited kind of compile-time argument checking using function prototyping. If you declare @@ -968,12 +1034,12 @@ corresponding built-in. sub myreverse (@) myreverse $a, $b, $c sub myjoin ($@) myjoin ":", $a, $b, $c sub mypop (\@) mypop @array - sub mysplice (\@$$@) mysplice @array, @array, 0, @pushme + sub mysplice (\@$$@) mysplice @array, 0, 2, @pushme sub mykeys (\%) mykeys %{$hashref} sub myopen (*;$) myopen HANDLE, $name sub mypipe (**) mypipe READHANDLE, WRITEHANDLE sub mygrep (&@) mygrep { /foo/ } $a, $b, $c - sub myrand ($) myrand 42 + sub myrand (;$) myrand 42 sub mytime () mytime Any backslashed prototype character represents an actual argument @@ -1017,9 +1083,13 @@ follows: ... } -A semicolon separates mandatory arguments from optional arguments. +A semicolon (C<;>) separates mandatory arguments from optional arguments. It is redundant before C<@> or C<%>, which gobble up everything else. +As the last character of a prototype, or just before a semicolon, you can +use C<_> in place of C<$>: if this argument is not provided, C<$_> will be +used instead. + Note how the last three examples in the table above are treated specially by the parser. C is parsed as a true list operator, C is parsed as a true unary operator with unary @@ -1033,6 +1103,7 @@ without a prototype. The interesting thing about C<&> is that you can generate new syntax with it, provided it's in the initial position: +X<&> sub try (&@) { my($try,$catch) = @_; @@ -1057,6 +1128,7 @@ scoped, those anonymous subroutines can act like closures... (Gee, is this sounding a little Lispish? (Never mind.)))) And here's a reimplementation of the Perl C operator: +X sub mygrep (&@) { my $code = shift; @@ -1110,6 +1182,7 @@ This is all very powerful, of course, and should be used only in moderation to make the world a better place. =head2 Constant Functions +X Functions with a prototype of C<()> are potential candidates for inlining. If the result after optimization and constant folding @@ -1131,7 +1204,17 @@ The following functions would all be inlined: sub FLAG_MASK () { FLAG_FOO | FLAG_BAR } sub OPT_BAZ () { not (0x1B58 & FLAG_MASK) } - sub BAZ_VAL () { + + sub N () { int(OPT_BAZ) / 3 } + + sub FOO_SET () { 1 if FLAG_MASK & FLAG_FOO } + +Be aware that these will not be inlined; as they contain inner scopes, +the constant folding doesn't reduce them to a single constant: + + sub foo_set () { if (FLAG_MASK & FLAG_FOO) { 1 } } + + sub baz_val () { if (OPT_BAZ) { return 23; } @@ -1140,13 +1223,6 @@ The following functions would all be inlined: } } - sub N () { int(BAZ_VAL) / 3 } - BEGIN { - my $prod = 1; - for (1..N) { $prod *= $_ } - sub N_FACTORIAL () { $prod } - } - If you redefine a subroutine that was eligible for inlining, you'll get a mandatory warning. (You can use this warning to tell whether or not a particular subroutine is considered constant.) The warning is @@ -1162,6 +1238,7 @@ inlining mechanism in some other way, such as } =head2 Overriding Built-in Functions +X X X X Many built-in functions may be overridden, though this should be tried only occasionally and for good reason. Typically this might be @@ -1224,10 +1301,9 @@ that understands regular expressions. sub glob { my $pat = shift; my @got; - local *D; - if (opendir D, '.') { - @got = grep /$pat/, readdir D; - closedir D; + if (opendir my $d, '.') { + @got = grep /$pat/, readdir $d; + closedir $d; } return @got; } @@ -1279,11 +1355,13 @@ And, as you'll have noticed from the previous example, if you override C, the C<< <*> >> glob operator is overridden as well. In a similar fashion, overriding the C function also overrides -the equivalent I/O operator C<< >>. +the equivalent I/O operator C<< >>. Also, overriding +C also overrides the operators C<``> and C. Finally, some built-ins (e.g. C or C) can't be overridden. =head2 Autoloading +X X If you call a subroutine that is undefined, you would ordinarily get an immediate, fatal error complaining that the subroutine doesn't @@ -1335,6 +1413,7 @@ SelfLoader modules in L, and the document on adding C functions to Perl code in L. =head2 Subroutine Attributes +X X X A subroutine declaration or definition may have a list of attributes associated with it. If such an attribute list is present, it is @@ -1352,17 +1431,17 @@ nest properly. Examples of valid syntax (even though the attributes are unknown): - sub fnord (&\%) : switch(10,foo(7,3)) : expensive ; - sub plugh () : Ugly('\(") :Bad ; + sub fnord (&\%) : switch(10,foo(7,3)) : expensive; + sub plugh () : Ugly('\(") :Bad; sub xyzzy : _5x5 { ... } Examples of invalid syntax: - sub fnord : switch(10,foo() ; # ()-string not balanced - sub snoid : Ugly('(') ; # ()-string not balanced - sub xyzzy : 5x5 ; # "5x5" not a valid identifier - sub plugh : Y2::north ; # "Y2::north" not a simple identifier - sub snurt : foo + bar ; # "+" not a colon or space + sub fnord : switch(10,foo(); # ()-string not balanced + sub snoid : Ugly('('); # ()-string not balanced + sub xyzzy : 5x5; # "5x5" not a valid identifier + sub plugh : Y2::north; # "Y2::north" not a simple identifier + sub snurt : foo + bar; # "+" not a colon or space The attribute list is passed as a list of constant strings to the code which associates them with the subroutine. In particular, the second example