home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 1996 July
/
AMIGA_1996_7.BIN
/
ausgabe_7_96
/
pd-programmierung
/
perl5_002bin.lha
/
man
/
catp
/
perlsub.0
< prev
next >
Wrap
Text File
|
1996-03-02
|
70KB
|
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