home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-03-02 | 68.5 KB | 1,123 lines |
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- NNNNAAAAMMMMEEEE
- perlsub - Perl subroutines
-
- SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
- To declare subroutines:
-
- ssssuuuubbbb NNNNAAAAMMMMEEEE;;;; #### AAAA """"ffffoooorrrrwwwwaaaarrrrdddd"""" ddddeeeeccccllllaaaarrrraaaattttiiiioooonnnn....
- ssssuuuubbbb NNNNAAAAMMMMEEEE((((PPPPRRRROOOOTTTTOOOO))));;;; #### ddddiiiittttttttoooo,,,, bbbbuuuutttt wwwwiiiitttthhhh pppprrrroooottttoooottttyyyyppppeeeessss
-
- ssssuuuubbbb NNNNAAAAMMMMEEEE BBBBLLLLOOOOCCCCKKKK #### AAAA ddddeeeeccccllllaaaarrrraaaattttiiiioooonnnn aaaannnndddd aaaa ddddeeeeffffiiiinnnniiiittttiiiioooonnnn....
- ssssuuuubbbb NNNNAAAAMMMMEEEE((((PPPPRRRROOOOTTTTOOOO)))) BBBBLLLLOOOOCCCCKKKK #### ddddiiiittttttttoooo,,,, bbbbuuuutttt wwwwiiiitttthhhh pppprrrroooottttoooottttyyyyppppeeeessss
-
- To define an anonymous subroutine at runtime:
-
- $$$$ssssuuuubbbbrrrreeeeffff ==== ssssuuuubbbb BBBBLLLLOOOOCCCCKKKK;;;;
-
- To import subroutines:
-
- uuuusssseeee PPPPAAAACCCCKKKKAAAAGGGGEEEE qqqqwwww((((NNNNAAAAMMMMEEEE1111 NNNNAAAAMMMMEEEE2222 NNNNAAAAMMMMEEEE3333))));;;;
-
- To call subroutines:
-
- NNNNAAAAMMMMEEEE((((LLLLIIIISSSSTTTT))));;;; #### &&&& iiiissss ooooppppttttiiiioooonnnnaaaallll wwwwiiiitttthhhh ppppaaaarrrreeeennnnssss....
- NNNNAAAAMMMMEEEE LLLLIIIISSSSTTTT;;;; #### PPPPaaaarrrreeeennnnssss ooooppppttttiiiioooonnnnaaaallll iiiiffff pppprrrreeeeddddeeeeccccllllaaaarrrreeeedddd////iiiimmmmppppoooorrrrtttteeeedddd....
- &&&&NNNNAAAAMMMMEEEE;;;; #### PPPPaaaasssssssseeeessss ccccuuuurrrrrrrreeeennnntttt @@@@____ ttttoooo ssssuuuubbbbrrrroooouuuuttttiiiinnnneeee....
-
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- Like many languages, Perl provides for user-defined
- subroutines. These may be located anywhere in the main
- program, loaded in from other files via the ddddoooo, rrrreeeeqqqquuuuiiiirrrreeee,
- or uuuusssseeee keywords, or even generated on the fly using eeeevvvvaaaallll
- or anonymous subroutines (closures). You can even call a
- function indirectly using a variable containing its name
- or a CODE reference to it, as in $$$$vvvvaaaarrrr ==== \\\\&&&&ffffuuuunnnnccccttttiiiioooonnnn.
-
- The Perl model for function call and return values is
- simple: all functions are passed as parameters one single
- flat list of scalars, and all functions likewise return to
- their caller one single flat list of scalars. Any arrays
- or hashes in these call and return lists will collapse,
- losing their identities--but you may always use 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 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 $$$$____[[[[0000]]]] and $$$$____[[[[1111]]]]. The array @@@@____ is
- a local array, but its values are implicit references
- (predating the _p_e_r_l_r_e_f manpage) to the actual scalar
- parameters. The return value of the subroutine is the
-
-
-
- 30/Jan/96 perl 5.002 with 1
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- 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 indistinguishable list.
-
- Perl does not have named formal parameters, but in
- practice all you do is assign to a _m_y_(_) list of these.
- Any variables you use in the function that aren't declared
- private are global variables. For the gory details on
- creating private variables, see the sections below on
- L<"Private Variables via my()"> and the section on
- _/_"_T_e_m_p_o_r_a_r_y _V_a_l_u_e_s _v_i_a _l_o_c_a_l_(_). To create protected
- environments for a set of functions in a separate package
- (and probably a separate file), see the section on
- _P_a_c_k_a_g_e_s in the _p_e_r_l_m_o_d manpage.
-
- Example:
-
- ssssuuuubbbb mmmmaaaaxxxx {{{{
- mmmmyyyy $$$$mmmmaaaaxxxx ==== sssshhhhiiiifffftttt((((@@@@____))));;;;
- ffffoooorrrreeeeaaaacccchhhh $$$$ffffoooooooo ((((@@@@____)))) {{{{
- $$$$mmmmaaaaxxxx ==== $$$$ffffoooooooo iiiiffff $$$$mmmmaaaaxxxx <<<< $$$$ffffoooooooo;;;;
- }}}}
- rrrreeeettttuuuurrrrnnnn $$$$mmmmaaaaxxxx;;;;
- }}}}
- $$$$bbbbeeeessssttttddddaaaayyyy ==== mmmmaaaaxxxx(((($$$$mmmmoooonnnn,,,,$$$$ttttuuuueeee,,,,$$$$wwwweeeedddd,,,,$$$$tttthhhhuuuu,,,,$$$$ffffrrrriiii))));;;;
-
- Example:
-
- #### ggggeeeetttt aaaa lllliiiinnnneeee,,,, ccccoooommmmbbbbiiiinnnniiiinnnngggg ccccoooonnnnttttiiiinnnnuuuuaaaattttiiiioooonnnn lllliiiinnnneeeessss
- #### tttthhhhaaaatttt ssssttttaaaarrrrtttt wwwwiiiitttthhhh wwwwhhhhiiiitttteeeessssppppaaaacccceeee
-
- ssssuuuubbbb ggggeeeetttt____lllliiiinnnneeee {{{{
- $$$$tttthhhhiiiisssslllliiiinnnneeee ==== $$$$llllooooooookkkkaaaahhhheeeeaaaadddd;;;; #### GGGGLLLLOOOOBBBBAAAALLLL VVVVAAAARRRRIIIIAAAABBBBLLLLEEEESSSS!!!!!!!!
- LLLLIIIINNNNEEEE:::: wwwwhhhhiiiilllleeee (((($$$$llllooooooookkkkaaaahhhheeeeaaaadddd ==== <<<<SSSSTTTTDDDDIIIINNNN>>>>)))) {{{{
- iiiiffff (((($$$$llllooooooookkkkaaaahhhheeeeaaaadddd ====~~~~ ////^^^^[[[[ \\\\tttt]]]]////)))) {{{{
- $$$$tttthhhhiiiisssslllliiiinnnneeee ....==== $$$$llllooooooookkkkaaaahhhheeeeaaaadddd;;;;
- }}}}
- eeeellllsssseeee {{{{
- llllaaaasssstttt LLLLIIIINNNNEEEE;;;;
- }}}}
- }}}}
- $$$$tttthhhhiiiisssslllliiiinnnneeee;;;;
- }}}}
-
- $$$$llllooooooookkkkaaaahhhheeeeaaaadddd ==== <<<<SSSSTTTTDDDDIIIINNNN>>>>;;;; #### ggggeeeetttt ffffiiiirrrrsssstttt lllliiiinnnneeee
- wwwwhhhhiiiilllleeee (((($$$$____ ==== ggggeeeetttt____lllliiiinnnneeee(((()))))))) {{{{
- ............
- }}}}
-
- Use array assignment to a local list to name your formal
- arguments:
-
-
-
-
- 30/Jan/96 perl 5.002 with 2
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- ssssuuuubbbb mmmmaaaayyyybbbbeeeesssseeeetttt {{{{
- mmmmyyyy(((($$$$kkkkeeeeyyyy,,,, $$$$vvvvaaaalllluuuueeee)))) ==== @@@@____;;;;
- $$$$FFFFoooooooo{{{{$$$$kkkkeeeeyyyy}}}} ==== $$$$vvvvaaaalllluuuueeee uuuunnnnlllleeeessssssss $$$$FFFFoooooooo{{{{$$$$kkkkeeeeyyyy}}}};;;;
- }}}}
-
- This also has the effect of turning call-by-reference into
- call-by-value, since the assignment copies the values.
- Otherwise a function is free to do in-place modifications
- of @@@@____ and change its callers values.
-
- uuuuppppccccaaaasssseeee____iiiinnnn(((($$$$vvvv1111,,,, $$$$vvvv2222))));;;; #### tttthhhhiiiissss cccchhhhaaaannnnggggeeeessss $$$$vvvv1111 aaaannnndddd $$$$vvvv2222
- ssssuuuubbbb uuuuppppccccaaaasssseeee____iiiinnnn {{{{
- ffffoooorrrr ((((@@@@____)))) {{{{ ttttrrrr////aaaa----zzzz////AAAA----ZZZZ//// }}}}
- }}}}
-
- 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:
-
- uuuuppppccccaaaasssseeee____iiiinnnn((((""""ffffrrrreeeeddddeeeerrrriiiicccckkkk""""))));;;;
-
- It would be much safer if the _u_p_c_a_s_e___i_n_(_) function were
- written to return a copy of its parameters instead of
- changing them in place:
-
- (((($$$$vvvv3333,,,, $$$$vvvv4444)))) ==== uuuuppppccccaaaasssseeee(((($$$$vvvv1111,,,, $$$$vvvv2222))));;;; #### tttthhhhiiiissss ddddooooeeeessssnnnn''''tttt
- ssssuuuubbbb uuuuppppccccaaaasssseeee {{{{
- mmmmyyyy @@@@ppppaaaarrrrmmmmssss ==== @@@@____;;;;
- ffffoooorrrr ((((@@@@ppppaaaarrrrmmmmssss)))) {{{{ ttttrrrr////aaaa----zzzz////AAAA----ZZZZ//// }}}}
- #### wwwwaaaannnnttttaaaarrrrrrrraaaayyyy cccchhhheeeecccckkkkssss iiiiffff wwwweeee wwwweeeerrrreeee ccccaaaalllllllleeeedddd iiiinnnn lllliiiisssstttt ccccoooonnnntttteeeexxxxtttt
- rrrreeeettttuuuurrrrnnnn wwwwaaaannnnttttaaaarrrrrrrraaaayyyy ???? @@@@ppppaaaarrrrmmmmssss :::: $$$$ppppaaaarrrrmmmmssss[[[[0000]]]];;;;
- }}}}
-
- Notice how this (unprototyped) function doesn't care
- whether it was passed real scalars or arrays. Perl will
- see everything as one big long flat @@@@____ parameter list.
- This is one of the ways where Perl's simple argument-
- passing style shines. The _u_p_c_a_s_e_(_) function would work
- perfectly well without changing the _u_p_c_a_s_e_(_) definition
- even if we fed it things like this:
-
- @@@@nnnneeeewwwwlllliiiisssstttt ==== uuuuppppccccaaaasssseeee((((@@@@lllliiiisssstttt1111,,,, @@@@lllliiiisssstttt2222))));;;;
- @@@@nnnneeeewwwwlllliiiisssstttt ==== uuuuppppccccaaaasssseeee(((( sssspppplllliiiitttt ////::::////,,,, $$$$vvvvaaaarrrr ))));;;;
-
- Do not, however, be tempted to do this:
-
- ((((@@@@aaaa,,,, @@@@bbbb)))) ==== uuuuppppccccaaaasssseeee((((@@@@lllliiiisssstttt1111,,,, @@@@lllliiiisssstttt2222))));;;;
-
- Because like its flat incoming parameter list, the return
- list is also flat. So all you have managed to do here is
- stored everything in @@@@aaaa and made @@@@bbbb an empty list. See
- the section on _/_"_P_a_s_s _b_y _R_e_f_e_r_e_n_c_e for alternatives.
-
-
-
-
- 30/Jan/96 perl 5.002 with 3
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- A subroutine may be called using the "&" prefix. The "&"
- is optional in Perl 5, and so are the parens if the
- subroutine has been predeclared. (Note, however, that the
- "&" is _N_O_T optional when you're just naming the
- subroutine, such as when it's used as an argument to
- _d_e_f_i_n_e_d_(_) or _u_n_d_e_f_(_). Nor is it optional when you want to
- do an indirect subroutine call with a subroutine name or
- reference using the &&&&$$$$ssssuuuubbbbrrrreeeeffff(((()))) or &&&&{{{{$$$$ssssuuuubbbbrrrreeeeffff}}}}(((()))) constructs.
- See the _p_e_r_l_r_e_f manpage for more on that.)
-
- Subroutines may be called recursively. If a subroutine is
- called using the "&" form, the argument list is optional,
- and if omitted, no @@@@____ array is set up for the subroutine:
- the @@@@____ array at the time of the call is visible to
- subroutine instead. This is an efficiency mechanism that
- new users may wish to avoid.
-
- &&&&ffffoooooooo((((1111,,,,2222,,,,3333))));;;; #### ppppaaaassssssss tttthhhhrrrreeeeeeee aaaarrrrgggguuuummmmeeeennnnttttssss
- ffffoooooooo((((1111,,,,2222,,,,3333))));;;; #### tttthhhheeee ssssaaaammmmeeee
-
- ffffoooooooo(((())));;;; #### ppppaaaassssssss aaaa nnnnuuuullllllll lllliiiisssstttt
- &&&&ffffoooooooo(((())));;;; #### tttthhhheeee ssssaaaammmmeeee
-
- &&&&ffffoooooooo;;;; #### ffffoooooooo(((()))) ggggeeeetttt ccccuuuurrrrrrrreeeennnntttt aaaarrrrggggssss,,,, lllliiiikkkkeeee ffffoooooooo((((@@@@____)))) !!!!!!!!
- ffffoooooooo;;;; #### lllliiiikkkkeeee ffffoooooooo(((()))) IIIIFFFFFFFF ssssuuuubbbb ffffoooooooo pppprrrreeee----ddddeeeeccccllllaaaarrrreeeedddd,,,, eeeellllsssseeee """"ffffoooooooo""""
-
- Not only does the "&" form make the argument list
- optional, but it also disables any prototype checking on
- the 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 the section
- on Prototypes below.
-
- PPPPrrrriiiivvvvaaaatttteeee VVVVaaaarrrriiiiaaaabbbblllleeeessss vvvviiiiaaaa _m_y_(_)
-
- Synopsis:
-
- mmmmyyyy $$$$ffffoooooooo;;;; #### ddddeeeeccccllllaaaarrrreeee $$$$ffffoooooooo lllleeeexxxxiiiiccccaaaallllllllyyyy llllooooccccaaaallll
- mmmmyyyy ((((@@@@wwwwiiiidddd,,,, %%%%ggggeeeetttt))));;;; #### ddddeeeeccccllllaaaarrrreeee lllliiiisssstttt ooooffff vvvvaaaarrrriiiiaaaabbbblllleeeessss llllooooccccaaaallll
- mmmmyyyy $$$$ffffoooooooo ==== """"fffflllluuuurrrrpppp"""";;;; #### ddddeeeeccccllllaaaarrrreeee $$$$ffffoooooooo lllleeeexxxxiiiiccccaaaallll,,,, aaaannnndddd iiiinnnniiiitttt iiiitttt
- mmmmyyyy @@@@ooooooooffff ==== @@@@bbbbaaaarrrr;;;; #### ddddeeeeccccllllaaaarrrreeee @@@@ooooooooffff lllleeeexxxxiiiiccccaaaallll,,,, aaaannnndddd iiiinnnniiiitttt iiiitttt
-
- A "my" declares the listed variables to be confined
- (lexically) to the enclosing block, subroutine, eeeevvvvaaaallll, or
- ddddoooo////rrrreeeeqqqquuuuiiiirrrreeee////uuuusssseeee'd file. If more than one value is listed,
- the list must be placed in parens. All listed elements
- must be legal lvalues. Only alphanumeric identifiers may
- be lexically scoped--magical builtins like $/ must
- currently be localized with "local" instead.
-
- Unlike dynamic variables created by the "local" statement,
- lexical variables declared with "my" are totally hidden
- from the outside world, including any called subroutines
- (even if it's the same subroutine called from itself or
-
-
-
- 30/Jan/96 perl 5.002 with 4
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- elsewhere--every call gets its own copy).
-
- (An _e_v_a_l_(_), however, can see the lexical variables of the
- scope it is being evaluated in so long as the names aren't
- hidden by declarations within the _e_v_a_l_(_) itself. See the
- _p_e_r_l_r_e_f manpage.)
-
- The parameter list to _m_y_(_) may be assigned to if desired,
- which allows you to initialize your variables. (If no
- initializer is given for a particular variable, it is
- created with the undefined value.) Commonly this is used
- to name the parameters to a subroutine. Examples:
-
- $$$$aaaarrrrgggg ==== """"ffffrrrreeeedddd"""";;;; #### """"gggglllloooobbbbaaaallll"""" vvvvaaaarrrriiiiaaaabbbblllleeee
- $$$$nnnn ==== ccccuuuubbbbeeee____rrrrooooooootttt((((22227777))));;;;
- pppprrrriiiinnnntttt """"$$$$aaaarrrrgggg tttthhhhiiiinnnnkkkkssss tttthhhheeee rrrrooooooootttt iiiissss $$$$nnnn\\\\nnnn"""";;;;
- ffffrrrreeeedddd tttthhhhiiiinnnnkkkkssss tttthhhheeee rrrrooooooootttt iiiissss 3333
-
- ssssuuuubbbb ccccuuuubbbbeeee____rrrrooooooootttt {{{{
- mmmmyyyy $$$$aaaarrrrgggg ==== sssshhhhiiiifffftttt;;;; #### nnnnaaaammmmeeee ddddooooeeeessssnnnn''''tttt mmmmaaaatttttttteeeerrrr
- $$$$aaaarrrrgggg ********==== 1111////3333;;;;
- rrrreeeettttuuuurrrrnnnn $$$$aaaarrrrgggg;;;;
- }}}}
-
- The "my" is simply a modifier on something you might
- assign to. So when you do assign to the variables in its
- argument list, the "my" doesn't change whether those
- variables is viewed as a scalar or an array. So
-
- mmmmyyyy (((($$$$ffffoooooooo)))) ==== <<<<SSSSTTTTDDDDIIIINNNN>>>>;;;;
- mmmmyyyy @@@@FFFFOOOOOOOO ==== <<<<SSSSTTTTDDDDIIIINNNN>>>>;;;;
-
- both supply a list context to the righthand side, while
-
- mmmmyyyy $$$$ffffoooooooo ==== <<<<SSSSTTTTDDDDIIIINNNN>>>>;;;;
-
- supplies a scalar context. But the following only
- declares one variable:
-
- mmmmyyyy $$$$ffffoooooooo,,,, $$$$bbbbaaaarrrr ==== 1111;;;;
-
- That has the same effect as
-
- mmmmyyyy $$$$ffffoooooooo;;;;
- $$$$bbbbaaaarrrr ==== 1111;;;;
-
- The declared variable is not introduced (is not visible)
- until after the current statement. Thus,
-
- mmmmyyyy $$$$xxxx ==== $$$$xxxx;;;;
-
- can be used to initialize the new $$$$xxxx with the value of the
- old $$$$xxxx, and the expression
-
-
-
-
- 30/Jan/96 perl 5.002 with 5
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- mmmmyyyy $$$$xxxx ==== 111122223333 aaaannnndddd $$$$xxxx ======== 111122223333
-
- is false unless the old $$$$xxxx happened to have the value 123.
-
- Some users may wish to encourage the use of lexically
- scoped variables. As an aid to catching implicit
- references to package variables, if you say
-
- uuuusssseeee ssssttttrrrriiiicccctttt ''''vvvvaaaarrrrssss'''';;;;
-
- then any variable reference from there to the end of the
- enclosing block must either refer to a lexical variable,
- or must be fully qualified with the package name. A
- compilation error results otherwise. An inner block may
- countermand this with "no strict 'vars'".
-
- A _m_y_(_) has both a compile-time and a run-time effect. At
- compile time, the compiler takes notice of it; the
- principle usefulness of this is to quiet uuuusssseeee ssssttttrrrriiiicccctttt
- ''''vvvvaaaarrrrssss''''. The actual initialization doesn't happen until
- run time, so gets executed every time through a loop.
-
- Variables declared with "my" are not part of any package
- and are therefore never fully qualified with the package
- name. In particular, you're not allowed to try to make a
- package variable (or other global) lexical:
-
- mmmmyyyy $$$$ppppaaaacccckkkk::::::::vvvvaaaarrrr;;;; #### EEEERRRRRRRROOOORRRR!!!! IIIIlllllllleeeeggggaaaallll ssssyyyynnnnttttaaaaxxxx
- mmmmyyyy $$$$____;;;; #### aaaallllssssoooo iiiilllllllleeeeggggaaaallll ((((ccccuuuurrrrrrrreeeennnnttttllllyyyy))))
-
- In fact, a dynamic variable (also known as package or
- global variables) are still accessible using the fully
- qualified :: notation even while a lexical of the same
- name is also visible:
-
- ppppaaaacccckkkkaaaaggggeeee mmmmaaaaiiiinnnn;;;;
- llllooooccccaaaallll $$$$xxxx ==== 11110000;;;;
- mmmmyyyy $$$$xxxx ==== 22220000;;;;
- pppprrrriiiinnnntttt """"$$$$xxxx aaaannnndddd $$$$::::::::xxxx\\\\nnnn"""";;;;
-
- That will print out 20 and 10.
-
- You may declare "my" variables at the outer most scope of
- a file to totally hide any such identifiers from the
- outside world. This is similar to a C's static variables
- at the file level. To do this with a subroutine requires
- the use of a closure (anonymous function). If a block
- (such as an _e_v_a_l_(_), function, or ppppaaaacccckkkkaaaaggggeeee) wants to create
- a private subroutine that cannot be called from outside
- that block, it can declare a lexical variable containing
- an anonymous sub reference:
-
-
-
-
-
-
- 30/Jan/96 perl 5.002 with 6
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- mmmmyyyy $$$$sssseeeeccccrrrreeeetttt____vvvveeeerrrrssssiiiioooonnnn ==== ''''1111....000000001111----bbbbeeeettttaaaa'''';;;;
- mmmmyyyy $$$$sssseeeeccccrrrreeeetttt____ssssuuuubbbb ==== ssssuuuubbbb {{{{ pppprrrriiiinnnntttt $$$$sssseeeeccccrrrreeeetttt____vvvveeeerrrrssssiiiioooonnnn }}}};;;;
- &&&&$$$$sssseeeeccccrrrreeeetttt____ssssuuuubbbb(((())));;;;
-
- As long as the reference is never returned by any function
- within the module, no outside module can see the
- subroutine, since its name is not in any package's symbol
- table. Remember that it's not _R_E_A_L_L_Y called
- $$$$ssssoooommmmeeee____ppppaaaacccckkkk::::::::sssseeeeccccrrrreeeetttt____vvvveeeerrrrssssiiiioooonnnn or anything; it's just
- $$$$sssseeeeccccrrrreeeetttt____vvvveeeerrrrssssiiiioooonnnn, unqualified and unqualifiable.
-
- This does not work with object methods, however; all
- object methods have to be in the symbol table of some
- package to be found.
-
- Just because the lexical variable is lexically (also
- called statically) scoped doesn't mean that within a
- function it works like a C static. It normally works more
- like a C auto. But here's a mechanism for giving a
- function private variables with both lexical scoping and a
- static lifetime. If you do want to create something like
- C's static variables, just enclose the whole function in
- an extra block, and put the static variable outside the
- function but in the block.
-
- {{{{
- mmmmyyyy $$$$sssseeeeccccrrrreeeetttt____vvvvaaaallll ==== 0000;;;;
- ssssuuuubbbb ggggiiiimmmmmmmmeeee____aaaannnnooootttthhhheeeerrrr {{{{
- rrrreeeettttuuuurrrrnnnn ++++++++$$$$sssseeeeccccrrrreeeetttt____vvvvaaaallll;;;;
- }}}}
- }}}}
- #### $$$$sssseeeeccccrrrreeeetttt____vvvvaaaallll nnnnoooowwww bbbbeeeeccccoooommmmeeeessss uuuunnnnrrrreeeeaaaacccchhhhaaaabbbblllleeee bbbbyyyy tttthhhheeee oooouuuuttttssssiiiiddddeeee
- #### wwwwoooorrrrlllldddd,,,, bbbbuuuutttt rrrreeeettttaaaaiiiinnnnssss iiiittttssss vvvvaaaalllluuuueeee bbbbeeeettttwwwweeeeeeeennnn ccccaaaallllllllssss ttttoooo ggggiiiimmmmmmmmeeee____aaaannnnooootttthhhheeeerrrr
-
- If this function is being sourced in from a separate file
- via rrrreeeeqqqquuuuiiiirrrreeee or uuuusssseeee, then this is probably just fine. If
- it's all in the main program, you'll need to arrange for
- the _m_y_(_) to be executed early, either by putting the whole
- block above your pain program, or more likely, merely
- placing a BEGIN sub around it to make sure it gets
- executed before your program starts to run:
-
- ssssuuuubbbb BBBBEEEEGGGGIIIINNNN {{{{
- mmmmyyyy $$$$sssseeeeccccrrrreeeetttt____vvvvaaaallll ==== 0000;;;;
- ssssuuuubbbb ggggiiiimmmmmmmmeeee____aaaannnnooootttthhhheeeerrrr {{{{
- rrrreeeettttuuuurrrrnnnn ++++++++$$$$sssseeeeccccrrrreeeetttt____vvvvaaaallll;;;;
- }}}}
- }}}}
-
- See the _p_e_r_l_r_u_n manpage about the BEGIN function.
-
-
-
-
-
-
-
- 30/Jan/96 perl 5.002 with 7
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- TTTTeeeemmmmppppoooorrrraaaarrrryyyy VVVVaaaalllluuuueeeessss vvvviiiiaaaa _l_o_c_a_l_(_)
-
- NNNNOOOOTTTTEEEE: In general, you should be using "my" instead of
- "local", because it's faster and safer. Execeptions to
- this include the global punctuation variables, filehandles
- and formats, and direct manipulation of the Perl symbol
- table itself. Format variables often use "local" though,
- as do other variables whose current value must be visible
- to called subroutines.
-
- Synopsis:
-
- llllooooccccaaaallll $$$$ffffoooooooo;;;; #### ddddeeeeccccllllaaaarrrreeee $$$$ffffoooooooo ddddyyyynnnnaaaammmmiiiiccccaaaallllllllyyyy llllooooccccaaaallll
- llllooooccccaaaallll ((((@@@@wwwwiiiidddd,,,, %%%%ggggeeeetttt))));;;; #### ddddeeeeccccllllaaaarrrreeee lllliiiisssstttt ooooffff vvvvaaaarrrriiiiaaaabbbblllleeeessss llllooooccccaaaallll
- llllooooccccaaaallll $$$$ffffoooooooo ==== """"fffflllluuuurrrrpppp"""";;;; #### ddddeeeeccccllllaaaarrrreeee $$$$ffffoooooooo ddddyyyynnnnaaaammmmiiiicccc,,,, aaaannnndddd iiiinnnniiiitttt iiiitttt
- llllooooccccaaaallll @@@@ooooooooffff ==== @@@@bbbbaaaarrrr;;;; #### ddddeeeeccccllllaaaarrrreeee @@@@ooooooooffff ddddyyyynnnnaaaammmmiiiicccc,,,, aaaannnndddd iiiinnnniiiitttt iiiitttt
-
- llllooooccccaaaallll ****FFFFHHHH;;;; #### llllooooccccaaaalllliiiizzzzeeee $$$$FFFFHHHH,,,, @@@@FFFFHHHH,,,, %%%%FFFFHHHH,,,, &&&&FFFFHHHH ............
- llllooooccccaaaallll ****mmmmeeeerrrrllllyyyynnnn ==== ****rrrraaaannnnddddaaaallll;;;; #### nnnnoooowwww $$$$mmmmeeeerrrrllllyyyynnnn iiiissss rrrreeeeaaaallllllllyyyy $$$$rrrraaaannnnddddaaaallll,,,, pppplllluuuussss
- #### @@@@mmmmeeeerrrrllllyyyynnnn iiiissss rrrreeeeaaaallllllllyyyy @@@@rrrraaaannnnddddaaaallll,,,, eeeettttcccc
- llllooooccccaaaallll ****mmmmeeeerrrrllllyyyynnnn ==== ''''rrrraaaannnnddddaaaallll'''';;;; #### SSSSAAAAMMMMEEEE TTTTHHHHIIIINNNNGGGG:::: pppprrrroooommmmooootttteeee ''''rrrraaaannnnddddaaaallll'''' ttttoooo ****rrrraaaannnnddddaaaallll
- llllooooccccaaaallll ****mmmmeeeerrrrllllyyyynnnn ==== \\\\$$$$rrrraaaannnnddddaaaallll;;;; #### jjjjuuuusssstttt aaaalllliiiiaaaassss $$$$mmmmeeeerrrrllllyyyynnnn,,,, nnnnooootttt @@@@mmmmeeeerrrrllllyyyynnnn eeeettttcccc
-
- A _l_o_c_a_l_(_) modifies its listed variables to be local to the
- enclosing block, (or subroutine, eeeevvvvaaaallll{{{{}}}} or ddddoooo) and _t_h_e _a_n_y
- _c_a_l_l_e_d _f_r_o_m _w_i_t_h_i_n _t_h_a_t _b_l_o_c_k. A _l_o_c_a_l_(_) just gives
- temporary values to global (meaning package) variables.
- This is known as dynamic scoping. Lexical scoping is done
- with "my", which works more like C's auto declarations.
-
- If more than one variable is given to _l_o_c_a_l_(_), they must
- be placed in parens. All listed elements must be legal
- lvalues. This operator works by saving the current values
- of those variables in its argument list on a hidden stack
- and restoring them upon exiting the block, subroutine or
- eval. This means that called subroutines can also
- reference the local variable, but not the global one. The
- argument list may be assigned to if desired, which allows
- you to initialize your local variables. (If no
- initializer is given for a particular variable, it is
- created with an undefined value.) Commonly this is used
- to name the parameters to a subroutine. Examples:
-
- ffffoooorrrr $$$$iiii (((( 0000 ........ 9999 )))) {{{{
- $$$$ddddiiiiggggiiiittttssss{{{{$$$$iiii}}}} ==== $$$$iiii;;;;
- }}}}
- #### aaaassssssssuuuummmmeeee tttthhhhiiiissss ffffuuuunnnnccccttttiiiioooonnnn uuuusssseeeessss gggglllloooobbbbaaaallll %%%%ddddiiiiggggiiiittttssss hhhhaaaasssshhhh
- ppppaaaarrrrsssseeee____nnnnuuuummmm(((())));;;;
-
-
-
-
-
-
-
-
-
- 30/Jan/96 perl 5.002 with 8
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- #### nnnnoooowwww tttteeeemmmmppppoooorrrraaaarrrriiiillllyyyy aaaadddddddd ttttoooo %%%%ddddiiiiggggiiiittttssss hhhhaaaasssshhhh
- iiiiffff (((($$$$bbbbaaaasssseeee11112222)))) {{{{
- #### ((((NNNNOOOOTTTTEEEE:::: nnnnooootttt ccccllllaaaaiiiimmmmiiiinnnngggg tttthhhhiiiissss iiiissss eeeeffffffffiiiicccciiiieeeennnntttt!!!!))))
- llllooooccccaaaallll %%%%ddddiiiiggggiiiittttssss ==== ((((%%%%ddddiiiiggggiiiittttssss,,,, ''''tttt'''' ====>>>> 11110000,,,, ''''eeee'''' ====>>>> 11111111))));;;;
- ppppaaaarrrrsssseeee____nnnnuuuummmm(((())));;;; #### ppppaaaarrrrsssseeee____nnnnuuuummmm ggggeeeettttssss tttthhhhiiiissss nnnneeeewwww %%%%ddddiiiiggggiiiittttssss!!!!
- }}}}
- #### oooolllldddd %%%%ddddiiiiggggiiiittttssss rrrreeeessssttttoooorrrreeeedddd hhhheeeerrrreeee
-
- Because _l_o_c_a_l_(_) is a run-time command, and so gets
- executed every time through a loop. In releases of Perl
- previous to 5.0, this used more stack storage each time
- until the loop was exited. Perl now reclaims the space
- each time through, but it's still more efficient to
- declare your variables outside the loop.
-
- A local is simply a modifier on an lvalue expression.
- When you assign to a localized variable, the local doesn't
- change whether its list is viewed as a scalar or an array.
- So
-
- llllooooccccaaaallll(((($$$$ffffoooooooo)))) ==== <<<<SSSSTTTTDDDDIIIINNNN>>>>;;;;
- llllooooccccaaaallll @@@@FFFFOOOOOOOO ==== <<<<SSSSTTTTDDDDIIIINNNN>>>>;;;;
-
- both supply a list context to the righthand side, while
-
- llllooooccccaaaallll $$$$ffffoooooooo ==== <<<<SSSSTTTTDDDDIIIINNNN>>>>;;;;
-
- supplies a scalar context.
-
- PPPPaaaassssssssiiiinnnngggg SSSSyyyymmmmbbbboooollll TTTTaaaabbbblllleeee EEEEnnnnttttrrrriiiieeeessss ((((ttttyyyyppppeeeegggglllloooobbbbssss))))
-
- [Note: The mechanism described in this section was
- originally the only way to simulate pass-by-reference in
- older versions of Perl. While it still works fine in
- modern versions, the new reference mechanism is generally
- easier to work with. See below.]
-
- Sometimes you don't want to pass the value of an array to
- a subroutine but rather the name of it, so that the
- subroutine can modify the global copy of it rather than
- working with a local copy. In perl you can refer to all
- objects of a particular name by prefixing the name with a
- star: ****ffffoooooooo. This is often known as a "type glob", since
- the star on the front can be thought of as a wildcard
- match for all the funny prefix characters on variables and
- subroutines and such.
-
- When evaluated, the type glob produces a scalar value that
- represents all the objects of that name, including any
- filehandle, format or subroutine. When assigned to, it
- causes the name mentioned to refer to whatever "*" value
- was assigned to it. Example:
-
-
-
-
-
- 30/Jan/96 perl 5.002 with 9
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- ssssuuuubbbb ddddoooouuuubbbblllleeeeaaaarrrryyyy {{{{
- llllooooccccaaaallll((((****ssssoooommmmeeeeaaaarrrryyyy)))) ==== @@@@____;;;;
- ffffoooorrrreeeeaaaacccchhhh $$$$eeeelllleeeemmmm ((((@@@@ssssoooommmmeeeeaaaarrrryyyy)))) {{{{
- $$$$eeeelllleeeemmmm ****==== 2222;;;;
- }}}}
- }}}}
- ddddoooouuuubbbblllleeeeaaaarrrryyyy((((****ffffoooooooo))));;;;
- ddddoooouuuubbbblllleeeeaaaarrrryyyy((((****bbbbaaaarrrr))));;;;
-
- Note that scalars are already passed by reference, so you
- can modify scalar arguments without using this mechanism
- by referring explicitly to $$$$____[0] etc. You can modify all
- the elements of an array by passing all the elements as
- scalars, but you have to use the * mechanism (or the
- equivalent reference mechanism) to push, pop or change the
- size of an array. It will certainly be faster to pass the
- typeglob (or reference).
-
- Even if you don't want to modify an array, this mechanism
- is useful for passing multiple arrays in a single LIST,
- since normally the LIST mechanism will merge all the array
- values so that you can't extract out the individual
- arrays. For more on typeglobs, see the section on
- _T_y_p_e_g_l_o_b_s in the _p_e_r_l_d_a_t_a manpage.
-
- PPPPaaaassssssss bbbbyyyy RRRReeeeffffeeeerrrreeeennnncccceeee
-
- 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 you're going to have to use an
- explicit pass-by-reference. Before you do that, you need
- to understand references as detailed in the _p_e_r_l_r_e_f
- manpage. This section may not make much sense to you
- otherwise.
-
- Here are a few simple examples. First, let's pass in
- several arrays to a function and have it pop all of then,
- return a new list of all their former last elements:
-
- @@@@ttttaaaaiiiilllliiiinnnnggggssss ==== ppppooooppppmmmmaaaannnnyyyy (((( \\\\@@@@aaaa,,,, \\\\@@@@bbbb,,,, \\\\@@@@cccc,,,, \\\\@@@@dddd ))));;;;
-
- ssssuuuubbbb ppppooooppppmmmmaaaannnnyyyy {{{{
- mmmmyyyy $$$$aaaarrrreeeeffff;;;;
- mmmmyyyy @@@@rrrreeeettttlllliiiisssstttt ==== (((())));;;;
- ffffoooorrrreeeeaaaacccchhhh $$$$aaaarrrreeeeffff (((( @@@@____ )))) {{{{
- ppppuuuusssshhhh @@@@rrrreeeettttlllliiiisssstttt,,,, ppppoooopppp @@@@$$$$aaaarrrreeeeffff;;;;
- }}}}
- rrrreeeettttuuuurrrrnnnn @@@@rrrreeeettttlllliiiisssstttt;;;;
- }}}}
-
- Here's how you might write a function that returns a list
- of keys occurring in all the hashes passed to it:
-
-
-
-
-
- 30/Jan/96 perl 5.002 with 10
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- @@@@ccccoooommmmmmmmoooonnnn ==== iiiinnnntttteeeerrrr(((( \\\\%%%%ffffoooooooo,,,, \\\\%%%%bbbbaaaarrrr,,,, \\\\%%%%jjjjooooeeee ))));;;;
- ssssuuuubbbb iiiinnnntttteeeerrrr {{{{
- mmmmyyyy (((($$$$kkkk,,,, $$$$hhhhrrrreeeeffff,,,, %%%%sssseeeeeeeennnn))));;;; #### llllooooccccaaaallllssss
- ffffoooorrrreeeeaaaacccchhhh $$$$hhhhrrrreeeeffff ((((@@@@____)))) {{{{
- wwwwhhhhiiiilllleeee (((( $$$$kkkk ==== eeeeaaaacccchhhh %%%%$$$$hhhhrrrreeeeffff )))) {{{{
- $$$$sssseeeeeeeennnn{{{{$$$$kkkk}}}}++++++++;;;;
- }}}}
- }}}}
- rrrreeeettttuuuurrrrnnnn ggggrrrreeeepppp {{{{ $$$$sssseeeeeeeennnn{{{{$$$$____}}}} ======== @@@@____ }}}} kkkkeeeeyyyyssss %%%%sssseeeeeeeennnn;;;;
- }}}}
-
- So far, we're just using the normal list return mechanism.
- What happens if you want to pass or return a hash? Well,
- if you're only using one of them, or you don't mind them
- concatenating, then the normal calling convention is ok,
- although a little expensive.
-
- Where people get into trouble is here:
-
- ((((@@@@aaaa,,,, @@@@bbbb)))) ==== ffffuuuunnnncccc((((@@@@cccc,,,, @@@@dddd))));;;;
- oooorrrr
- ((((%%%%aaaa,,,, %%%%bbbb)))) ==== ffffuuuunnnncccc((((%%%%cccc,,,, %%%%dddd))));;;;
-
- That syntax simply won't work. It just sets @@@@aaaa or %%%%aaaa and
- clears the @@@@bbbb or %%%%bbbb. Plus the function didn't get passed
- into two separate arrays or hashes: it got one long list
- in @@@@____, as always.
-
- If you can arrange for everyone to deal with this through
- references, it's cleaner code, although not so nice to
- look at. Here's a function that takes two array
- references as arguments, returning the two array elements
- in order of how many elements they have in them:
-
- (((($$$$aaaarrrreeeeffff,,,, $$$$bbbbrrrreeeeffff)))) ==== ffffuuuunnnncccc((((\\\\@@@@cccc,,,, \\\\@@@@dddd))));;;;
- pppprrrriiiinnnntttt """"@@@@$$$$aaaarrrreeeeffff hhhhaaaassss mmmmoooorrrreeee tttthhhhaaaannnn @@@@$$$$bbbbrrrreeeeffff\\\\nnnn"""";;;;
- ssssuuuubbbb ffffuuuunnnncccc {{{{
- mmmmyyyy (((($$$$ccccrrrreeeeffff,,,, $$$$ddddrrrreeeeffff)))) ==== @@@@____;;;;
- iiiiffff ((((@@@@$$$$ccccrrrreeeeffff >>>> @@@@$$$$ddddrrrreeeeffff)))) {{{{
- rrrreeeettttuuuurrrrnnnn (((($$$$ccccrrrreeeeffff,,,, $$$$ddddrrrreeeeffff))));;;;
- }}}} eeeellllsssseeee {{{{
- rrrreeeettttuuuurrrrnnnn (((($$$$ddddrrrreeeeffff,,,, $$$$ccccrrrreeeeffff))));;;;
- }}}}
- }}}}
-
- It turns out that you can actually do this also:
-
-
-
-
-
-
-
-
-
-
-
- 30/Jan/96 perl 5.002 with 11
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- ((((****aaaa,,,, ****bbbb)))) ==== ffffuuuunnnncccc((((\\\\@@@@cccc,,,, \\\\@@@@dddd))));;;;
- pppprrrriiiinnnntttt """"@@@@aaaa hhhhaaaassss mmmmoooorrrreeee tttthhhhaaaannnn @@@@bbbb\\\\nnnn"""";;;;
- ssssuuuubbbb ffffuuuunnnncccc {{{{
- llllooooccccaaaallll ((((****cccc,,,, ****dddd)))) ==== @@@@____;;;;
- iiiiffff ((((@@@@cccc >>>> @@@@dddd)))) {{{{
- rrrreeeettttuuuurrrrnnnn ((((\\\\@@@@cccc,,,, \\\\@@@@dddd))));;;;
- }}}} eeeellllsssseeee {{{{
- rrrreeeettttuuuurrrrnnnn ((((\\\\@@@@dddd,,,, \\\\@@@@cccc))));;;;
- }}}}
- }}}}
-
- Here we're using the typeglobs to do symbol table
- aliasing. It's a tad subtle, though, and also won't work
- if you're using _m_y_(_) variables, since only globals (well,
- and _l_o_c_a_l_(_)s) are in the symbol table.
-
- If you're passing around filehandles, you could usually
- just use the bare typeglob, like *STDOUT, but typeglobs
- references would be better because they'll still work
- properly under uuuusssseeee ssssttttrrrriiiicccctttt ''''rrrreeeeffffssss''''. For example:
-
- sssspppplllluuuutttttttteeeerrrr((((\\\\****SSSSTTTTDDDDOOOOUUUUTTTT))));;;;
- ssssuuuubbbb sssspppplllluuuutttttttteeeerrrr {{{{
- mmmmyyyy $$$$ffffhhhh ==== sssshhhhiiiifffftttt;;;;
- pppprrrriiiinnnntttt $$$$ffffhhhh """"hhhheeeerrrr uuuummmm wwwweeeellllllll aaaa hhhhmmmmmmmmmmmm\\\\nnnn"""";;;;
- }}}}
-
- $$$$rrrreeeecccc ==== ggggeeeetttt____rrrreeeecccc((((\\\\****SSSSTTTTDDDDIIIINNNN))));;;;
- ssssuuuubbbb ggggeeeetttt____rrrreeeecccc {{{{
- mmmmyyyy $$$$ffffhhhh ==== sssshhhhiiiifffftttt;;;;
- rrrreeeettttuuuurrrrnnnn ssssccccaaaallllaaaarrrr <<<<$$$$ffffhhhh>>>>;;;;
- }}}}
-
- If you're planning on generating new filehandles, you
- could do this:
-
- ssssuuuubbbb ooooppppeeeennnniiiitttt {{{{
- mmmmyyyy $$$$nnnnaaaammmmeeee ==== sssshhhhiiiifffftttt;;;;
- llllooooccccaaaallll ****FFFFHHHH;;;;
- rrrreeeettttuuuurrrrnnnn ooooppppeeeennnn ((((FFFFHHHH,,,, $$$$ppppaaaatttthhhh)))) ???? \\\\****FFFFHHHH :::: uuuunnnnddddeeeeffff;;;;
- }}}}
-
- Although that will actually produce a small memory leak.
- See the bottom of the ooooppppeeeennnn(((()))) entry in the _p_e_r_l_f_u_n_c manpage
- for a somewhat cleaner way using the FileHandle functions
- supplied with the POSIX package.
-
- PPPPrrrroooottttoooottttyyyyppppeeeessss
-
- As of the 5.002 release of perl, if you declare
-
- ssssuuuubbbb mmmmyyyyppppuuuusssshhhh ((((\\\\@@@@@@@@))))
-
- then _m_y_p_u_s_h_(_) takes arguments exactly like _p_u_s_h_(_) does.
-
-
-
- 30/Jan/96 perl 5.002 with 12
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- The declaration of the function to be called must be
- visible at compile time. The prototype only affects the
- interpretation of new-style calls to the function, where
- new-style is defined as not using the &&&& character. In
- other words, if you call it like a builtin function, then
- it behaves like a builtin function. If you call it like
- an old-fashioned subroutine, then it behaves like an old-
- fashioned subroutine. It naturally falls out from this
- rule that prototypes have no influence on subroutine
- references like \\\\&&&&ffffoooooooo or on indirect subroutine calls like
- &&&&{{{{$$$$ssssuuuubbbbrrrreeeeffff}}}}.
-
- Method calls are not influenced by prototypes either,
- because the function to be called is indeterminate at
- compile time, since it depends on inheritance.
-
- Since the intent is primarily to let you define
- subroutines that work like builtin commands, here are the
- prototypes for some other functions that parse almost
- exactly like the corresponding builtins.
-
- DDDDeeeeccccllllaaaarrrreeeedddd aaaassss CCCCaaaalllllllleeeedddd aaaassss
-
- ssssuuuubbbb mmmmyyyylllliiiinnnnkkkk (((($$$$$$$$)))) mmmmyyyylllliiiinnnnkkkk $$$$oooolllldddd,,,, $$$$nnnneeeewwww
- ssssuuuubbbb mmmmyyyyvvvveeeecccc (((($$$$$$$$$$$$)))) mmmmyyyyvvvveeeecccc $$$$vvvvaaaarrrr,,,, $$$$ooooffffffffsssseeeetttt,,,, 1111
- ssssuuuubbbb mmmmyyyyiiiinnnnddddeeeexxxx (((($$$$$$$$;;;;$$$$)))) mmmmyyyyiiiinnnnddddeeeexxxx &&&&ggggeeeettttssssttttrrrriiiinnnngggg,,,, """"ssssuuuubbbbssssttttrrrr""""
- ssssuuuubbbb mmmmyyyyssssyyyysssswwwwrrrriiiitttteeee (((($$$$$$$$$$$$;;;;$$$$)))) mmmmyyyyssssyyyysssswwwwrrrriiiitttteeee $$$$bbbbuuuuffff,,,, 0000,,,, lllleeeennnnggggtttthhhh(((($$$$bbbbuuuuffff)))) ---- $$$$ooooffffffff,,,, $$$$ooooffffffff
- ssssuuuubbbb mmmmyyyyrrrreeeevvvveeeerrrrsssseeee ((((@@@@)))) mmmmyyyyrrrreeeevvvveeeerrrrsssseeee $$$$aaaa,,,,$$$$bbbb,,,,$$$$cccc
- ssssuuuubbbb mmmmyyyyjjjjooooiiiinnnn (((($$$$@@@@)))) mmmmyyyyjjjjooooiiiinnnn """"::::"""",,,,$$$$aaaa,,,,$$$$bbbb,,,,$$$$cccc
- ssssuuuubbbb mmmmyyyyppppoooopppp ((((\\\\@@@@)))) mmmmyyyyppppoooopppp @@@@aaaarrrrrrrraaaayyyy
- ssssuuuubbbb mmmmyyyysssspppplllliiiicccceeee ((((\\\\@@@@$$$$$$$$@@@@)))) mmmmyyyysssspppplllliiiicccceeee @@@@aaaarrrrrrrraaaayyyy,,,,@@@@aaaarrrrrrrraaaayyyy,,,,0000,,,,@@@@ppppuuuusssshhhhmmmmeeee
- ssssuuuubbbb mmmmyyyykkkkeeeeyyyyssss ((((\\\\%%%%)))) mmmmyyyykkkkeeeeyyyyssss %%%%{{{{$$$$hhhhaaaasssshhhhrrrreeeeffff}}}}
- ssssuuuubbbb mmmmyyyyooooppppeeeennnn ((((****;;;;$$$$)))) mmmmyyyyooooppppeeeennnn HHHHAAAANNNNDDDDLLLLEEEE,,,, $$$$nnnnaaaammmmeeee
- ssssuuuubbbb mmmmyyyyppppiiiippppeeee ((((********)))) mmmmyyyyppppiiiippppeeee RRRREEEEAAAADDDDHHHHAAAANNNNDDDDLLLLEEEE,,,, WWWWRRRRIIIITTTTEEEEHHHHAAAANNNNDDDDLLLLEEEE
- ssssuuuubbbb mmmmyyyyggggrrrreeeepppp ((((&&&&@@@@)))) mmmmyyyyggggrrrreeeepppp {{{{ ////ffffoooooooo//// }}}} $$$$aaaa,,,,$$$$bbbb,,,,$$$$cccc
- ssssuuuubbbb mmmmyyyyrrrraaaannnndddd (((($$$$)))) mmmmyyyyrrrraaaannnndddd 44442222
- ssssuuuubbbb mmmmyyyyttttiiiimmmmeeee (((()))) mmmmyyyyttttiiiimmmmeeee
-
- Any backslashed prototype character represents an actual
- argument that absolutely must start with that character.
-
- Unbackslashed prototype characters have special meanings.
- Any unbackslashed @ or % eats all the rest of the
- arguments, and forces list context. An argument
- represented by $ forces scalar context. An & requires an
- anonymous subroutine, which, if passed as the first
- argument, does not require the "sub" keyword or a
- subsequent comma. A * does whatever it has to do to turn
- the argument into a reference to a symbol table entry.
-
- A semicolon separates mandatory arguments from optional
- arguments. (It is redundant before @ or %.)
-
- Note how the last three examples above are treated
-
-
-
- 30/Jan/96 perl 5.002 with 13
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- specially by the parser. _m_y_g_r_e_p_(_) is parsed as a true
- list operator, _m_y_r_a_n_d_(_) is parsed as a true unary operator
- with unary precedence the same as _r_a_n_d_(_), and _m_y_t_i_m_e_(_) is
- truly argumentless, just like _t_i_m_e_(_). That is, if you say
-
- mmmmyyyyttttiiiimmmmeeee ++++2222;;;;
-
- you'll get _m_y_t_i_m_e_(_) + 2, not _m_y_t_i_m_e(2), which is how it
- would be parsed without the prototype.
-
- The interesting thing about & is that you can generate new
- syntax with it:
-
- ssssuuuubbbb ttttrrrryyyy ((((&&&&$$$$)))) {{{{
- mmmmyyyy(((($$$$ttttrrrryyyy,,,,$$$$ccccaaaattttcccchhhh)))) ==== @@@@____;;;;
- eeeevvvvaaaallll {{{{ &&&&$$$$ttttrrrryyyy }}}};;;;
- iiiiffff (((($$$$@@@@)))) {{{{
- llllooooccccaaaallll $$$$____ ==== $$$$@@@@;;;;
- &&&&$$$$ccccaaaattttcccchhhh;;;;
- }}}}
- }}}}
- ssssuuuubbbb ccccaaaattttcccchhhh ((((&&&&)))) {{{{ @@@@____ }}}}
-
- ttttrrrryyyy {{{{
- ddddiiiieeee """"pppphhhhooooooooeeeeyyyy"""";;;;
- }}}} ccccaaaattttcccchhhh {{{{
- ////pppphhhhooooooooeeeeyyyy//// aaaannnndddd pppprrrriiiinnnntttt """"uuuunnnnpppphhhhooooooooeeeeyyyy\\\\nnnn"""";;;;
- }}}};;;;
-
- That prints "unphooey". (Yes, there are still unresolved
- issues having to do with the visibility of @@@@____. I'm
- ignoring that question for the moment. (But note that if
- we make @@@@____ lexically scoped, those anonymous subroutines
- can act like closures... (Gee, is this sounding a little
- Lispish? (Nevermind.))))
-
- And here's a reimplementation of grep:
-
- ssssuuuubbbb mmmmyyyyggggrrrreeeepppp ((((&&&&@@@@)))) {{{{
- mmmmyyyy $$$$ccccooooddddeeee ==== sssshhhhiiiifffftttt;;;;
- mmmmyyyy @@@@rrrreeeessssuuuulllltttt;;;;
- ffffoooorrrreeeeaaaacccchhhh $$$$____ ((((@@@@____)))) {{{{
- ppppuuuusssshhhh((((@@@@rrrreeeessssuuuulllltttt,,,, $$$$____)))) iiiiffff &&&&$$$$rrrreeeeffff;;;;
- }}}}
- @@@@rrrreeeessssuuuulllltttt;;;;
- }}}}
-
- Some folks would prefer full alphanumeric prototypes.
- Alphanumerics have been intentionally left out of
- prototypes for the express purpose of someday in the
- future adding named, formal parameters. The current
- mechanism's main goal is to let module writers provide
- better diagnostics for module users. Larry feels the
- notation quite understandable to Perl programmers, and
-
-
-
- 30/Jan/96 perl 5.002 with 14
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- that it will not intrude greatly upon the meat of the
- module, nor make it harder to read. The line noise is
- visually encapsulated into a small pill that's easy to
- swallow.
-
- It's probably best to prototype new functions, not
- retrofit prototyping into older ones. That's because you
- must be especially careful about silent impositions of
- differing list versus scalar contexts. For example, if
- you decide that a function should take just one parameter,
- like this:
-
- ssssuuuubbbb ffffuuuunnnncccc (((($$$$)))) {{{{
- mmmmyyyy $$$$nnnn ==== sssshhhhiiiifffftttt;;;;
- pppprrrriiiinnnntttt """"yyyyoooouuuu ggggaaaavvvveeee mmmmeeee $$$$nnnn\\\\nnnn"""";;;;
- }}}}
-
- and someone has been calling it with an array or
- expression returning a list:
-
- ffffuuuunnnncccc((((@@@@ffffoooooooo))));;;;
- ffffuuuunnnncccc(((( sssspppplllliiiitttt ////:::://// ))));;;;
-
- Then you've just supplied an automatic _s_c_a_l_a_r_(_) in front
- of their argument, which can be more than a bit
- surprising. The old @@@@ffffoooooooo which used to hold one thing
- doesn't get passed in. Instead, the _f_u_n_c_(_) now gets
- passed in 1, that is, the number of elments in @@@@ffffoooooooo. And
- the _s_p_l_i_t_(_) gets called in a scalar context and starts
- scribbling on your @@@@____ parameter list.
-
- This is all very powerful, of course, and should only be
- used in moderation to make the world a better place.
-
- OOOOvvvveeeerrrrrrrriiiiddddiiiinnnngggg BBBBuuuuiiiillllttttiiiinnnn FFFFuuuunnnnccccttttiiiioooonnnnssss
-
- Many builtin functions may be overridden, though this
- should only be tried occasionally and for good reason.
- Typically this might be done by a package attempting to
- emulate missing builtin functionality on a non-Unix
- system.
-
- Overriding may only be done by importing the name from a
- module--ordinary predeclaration isn't good enough.
- However, the ssssuuuubbbbssss pragma (compiler directive) lets you, in
- effect, predeclare subs via the import syntax, and these
- names may then override the builtin ones:
-
- uuuusssseeee ssssuuuubbbbssss ''''cccchhhhddddiiiirrrr'''',,,, ''''cccchhhhrrrrooooooootttt'''',,,, ''''cccchhhhmmmmoooodddd'''',,,, ''''cccchhhhoooowwwwnnnn'''';;;;
- cccchhhhddddiiiirrrr $$$$ssssoooommmmeeeewwwwhhhheeeerrrreeee;;;;
- ssssuuuubbbb cccchhhhddddiiiirrrr {{{{ ............ }}}}
-
- Library modules should not in general export builtin names
- like "open" or "chdir" as part of their default @@@@EEEEXXXXPPPPOOOORRRRTTTT
-
-
-
- 30/Jan/96 perl 5.002 with 15
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- list, since these may sneak into someone else's namespace
- and change the semantics unexpectedly. Instead, if the
- module adds the name to the @@@@EEEEXXXXPPPPOOOORRRRTTTT____OOOOKKKK list, then it's
- possible for a user to import the name explicitly, but not
- implicitly. That is, they could say
-
- uuuusssseeee MMMMoooodddduuuulllleeee ''''ooooppppeeeennnn'''';;;;
-
- and it would import the open override, but if they said
-
- uuuusssseeee MMMMoooodddduuuulllleeee;;;;
-
- they would get the default imports without the overrides.
-
- AAAAuuuuttttoooollllooooaaaaddddiiiinnnngggg
-
- If you call a subroutine that is undefined, you would
- ordinarily get an immediate fatal error complaining that
- the subroutine doesn't exist. (Likewise for subroutines
- being used as methods, when the method doesn't exist in
- any of the base classes of the class package.) If,
- however, there is an AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD subroutine defined in the
- package or packages that were searched for the original
- subroutine, then that AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD subroutine is called with
- the arguments that would have been passed to the original
- subroutine. The fully qualified name of the original
- subroutine magically appears in the $$$$AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD variable in
- the same package as the AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD routine. The name is not
- passed as an ordinary argument because, er, well, just
- because, that's why...
-
- Most AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD routines will load in a definition for the
- subroutine in question using eval, and then execute that
- subroutine using a special form of "goto" that erases the
- stack frame of the AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD routine without a trace. (See
- the standard AAAAuuuuttttooooLLLLooooaaaaddddeeeerrrr module, for example.) But an
- AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD routine can also just emulate the routine and
- never define it. For example, let's pretend that a
- function that wasn't defined should just call _s_y_s_t_e_m_(_)
- with those arguments. All you'd do is this:
-
- ssssuuuubbbb AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD {{{{
- mmmmyyyy $$$$pppprrrrooooggggrrrraaaammmm ==== $$$$AAAAUUUUTTTTOOOOLLLLOOOOAAAADDDD;;;;
- $$$$pppprrrrooooggggrrrraaaammmm ====~~~~ ssss////....****::::::::////////;;;;
- ssssyyyysssstttteeeemmmm(((($$$$pppprrrrooooggggrrrraaaammmm,,,, @@@@____))));;;;
- }}}}
- ddddaaaatttteeee(((())));;;;
- wwwwhhhhoooo((((''''aaaammmm'''',,,, iiii''''))));;;;
- llllssss((((''''----llll''''))));;;;
-
- In fact, if you preclare the functions you want to call
- that way, you don't even need the parentheses:
-
-
-
-
-
- 30/Jan/96 perl 5.002 with 16
-
-
-
-
-
- PERLSUB(1) User Contributed Perl Documentation PERLSUB(1)
-
-
- uuuusssseeee ssssuuuubbbbssss qqqqwwww((((ddddaaaatttteeee wwwwhhhhoooo llllssss))));;;;
- ddddaaaatttteeee;;;;
- wwwwhhhhoooo """"aaaammmm"""",,,, """"iiii"""";;;;
- llllssss ----llll;;;;
-
- A more complete example of this is the standard Shell
- module, which can treat undefined subroutine calls as
- calls to Unix programs.
-
- Mechanisms are available for modules writers to help split
- the modules up into autoloadable files. See the standard
- AutoLoader module described in the _A_u_t_o_l_o_a_d_e_r manpage, the
- standard SelfLoader modules in the _S_e_l_f_L_o_a_d_e_r manpage, and
- the document on adding C functions to perl code in the
- _p_e_r_l_x_s manpage.
-
- SSSSEEEEEEEE AAAALLLLSSSSOOOO
- See the _p_e_r_l_r_e_f manpage for more on references. See the
- _p_e_r_l_x_s manpage if you'd like to learn about calling C
- subroutines from perl. See the _p_e_r_l_m_o_d manpage to learn
- about bundling up your functions in separate files.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 30/Jan/96 perl 5.002 with 17
-
-
-