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
/
perlref.0
< prev
next >
Wrap
Text File
|
1996-03-02
|
36KB
|
661 lines
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
NNNNAAAAMMMMEEEE
perlref - Perl references and nested data structures
DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
Before release 5 of Perl it was difficult to represent
complex data structures, because all references had to be
symbolic, and even that was difficult to do when you
wanted to refer to a variable rather than a symbol table
entry. Perl 5 not only makes it easier to use symbolic
references to variables, but lets you have "hard"
references to any piece of data. Any scalar may hold a
hard reference. Since arrays and hashes contain scalars,
you can now easily build arrays of arrays, arrays of
hashes, hashes of arrays, arrays of hashes of functions,
and so on.
Hard references are smart--they keep track of reference
counts for you, automatically freeing the thing referred
to when its reference count goes to zero. If that thing
happens to be an object, the object is destructed. See
the _p_e_r_l_o_b_j manpage for more about objects. (In a sense,
everything in Perl is an object, but we usually reserve
the word for references to objects that have been
officially "blessed" into a class package.)
A symbolic reference contains the name of a variable, just
as a symbolic link in the filesystem merely contains the
name of a file. The ****gggglllloooobbbb notation is a kind of symbolic
reference. Hard references are more like hard links in
the file system: merely another way at getting at the same
underlying object, irrespective of its name.
"Hard" references are easy to use in Perl. There is just
one overriding principle: Perl does no implicit
referencing or dereferencing. When a scalar is holding a
reference, it always behaves as a scalar. It doesn't
magically start being an array or a hash unless you tell
it so explicitly by dereferencing it.
References can be constructed several ways.
1. By using the backslash operator on a variable,
subroutine, or value. (This works much like the &
(address-of) operator works in C.) Note that this
typically creates _A_N_O_T_H_E_R reference to a variable,
since there's already a reference to the variable in
the symbol table. But the symbol table reference
might go away, and you'll still have the reference
that the backslash returned. Here are some examples:
23/Jan/96 perl 5.002 with 1
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
$$$$ssssccccaaaallllaaaarrrrrrrreeeeffff ==== \\\\$$$$ffffoooooooo;;;;
$$$$aaaarrrrrrrraaaayyyyrrrreeeeffff ==== \\\\@@@@AAAARRRRGGGGVVVV;;;;
$$$$hhhhaaaasssshhhhrrrreeeeffff ==== \\\\%%%%EEEENNNNVVVV;;;;
$$$$ccccooooddddeeeerrrreeeeffff ==== \\\\&&&&hhhhaaaannnnddddlllleeeerrrr;;;;
$$$$gggglllloooobbbbrrrreeeeffff ==== \\\\****SSSSTTTTDDDDOOOOUUUUTTTT;;;;
2. A reference to an anonymous array can be constructed
using square brackets:
$$$$aaaarrrrrrrraaaayyyyrrrreeeeffff ==== [[[[1111,,,, 2222,,,, [[[[''''aaaa'''',,,, ''''bbbb'''',,,, ''''cccc'''']]]]]]]];;;;
Here we've constructed a reference to an anonymous
array of three elements whose final element is itself
reference to another anonymous array of three
elements. (The multidimensional syntax described
later can be used to access this. For example, after
the above, $$$$aaaarrrrrrrraaaayyyyrrrreeeeffff->[2][1] would have the value
"b".)
Note that taking a reference to an enumerated list is
not the same as using square brackets--instead it's
the same as creating a list of references!
@@@@lllliiiisssstttt ==== ((((\\\\$$$$aaaa,,,, \\\\$$$$bbbb,,,, \\\\$$$$cccc))));;;;
@@@@lllliiiisssstttt ==== \\\\(((($$$$aaaa,,,, $$$$bbbb,,,, $$$$cccc))));;;; #### ssssaaaammmmeeee tttthhhhiiiinnnngggg!!!!
3. A reference to an anonymous hash can be constructed
using curly brackets:
$$$$hhhhaaaasssshhhhrrrreeeeffff ==== {{{{
''''AAAAddddaaaammmm'''' ====>>>> ''''EEEEvvvveeee'''',,,,
''''CCCCllllyyyyddddeeee'''' ====>>>> ''''BBBBoooonnnnnnnniiiieeee'''',,,,
}}}};;;;
Anonymous hash and array constructors can be
intermixed freely to produce as complicated a
structure as you want. The multidimensional syntax
described below works for these too. The values above
are literals, but variables and expressions would work
just as well, because assignment operators in Perl
(even within _l_o_c_a_l_(_) or _m_y_(_)) are executable
statements, not compile-time declarations.
Because curly brackets (braces) are used for several
other things including BLOCKs, you may occasionally
have to disambiguate braces at the beginning of a
statement by putting a ++++ or a rrrreeeettttuuuurrrrnnnn in front so that
Perl realizes the opening brace isn't starting a
BLOCK. The economy and mnemonic value of using
curlies is deemed worth this occasional extra hassle.
For example, if you wanted a function to make a new
23/Jan/96 perl 5.002 with 2
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
hash and return a reference to it, you have these
options:
ssssuuuubbbb hhhhaaaasssshhhheeeemmmm {{{{ {{{{ @@@@____ }}}} }}}} #### ssssiiiilllleeeennnnttttllllyyyy wwwwrrrroooonnnngggg
ssssuuuubbbb hhhhaaaasssshhhheeeemmmm {{{{ ++++{{{{ @@@@____ }}}} }}}} #### ooookkkk
ssssuuuubbbb hhhhaaaasssshhhheeeemmmm {{{{ rrrreeeettttuuuurrrrnnnn {{{{ @@@@____ }}}} }}}} #### ooookkkk
4. A reference to an anonymous subroutine can be
constructed by using ssssuuuubbbb without a subname:
$$$$ccccooooddddeeeerrrreeeeffff ==== ssssuuuubbbb {{{{ pppprrrriiiinnnntttt """"BBBBooooiiiinnnnkkkk!!!!\\\\nnnn"""" }}}};;;;
Note the presence of the semicolon. Except for the
fact that the code inside isn't executed immediately,
a ssssuuuubbbb {{{{}}}} is not so much a declaration as it is an
operator, like ddddoooo{{{{}}}} or eeeevvvvaaaallll{{{{}}}}. (However, no matter
how many times you execute that line (unless you're in
an eeeevvvvaaaallll((((""""............""""))))), $$$$ccccooooddddeeeerrrreeeeffff will still have a reference
to the _S_A_M_E anonymous subroutine.)
Anonymous subroutines act as closures with respect to
_m_y_(_) variables, that is, variables visible lexically
within the current scope. Closure is a notion out of
the Lisp world that says if you define an anonymous
function in a particular lexical context, it pretends
to run in that context even when it's called outside
of the context.
In human terms, it's a funny way of passing arguments
to a subroutine when you define it as well as when you
call it. It's useful for setting up little bits of
code to run later, such as callbacks. You can even do
object-oriented stuff with it, though Perl provides a
different mechanism to do that already--see the
_p_e_r_l_o_b_j manpage.
You can also think of closure as a way to write a
subroutine template without using eval. (In fact, in
version 5.000, eval was the _o_n_l_y way to get closures.
You may wish to use "require 5.001" if you use
closures.)
Here's a small example of how closures works:
ssssuuuubbbb nnnneeeewwwwpppprrrriiiinnnntttt {{{{
mmmmyyyy $$$$xxxx ==== sssshhhhiiiifffftttt;;;;
rrrreeeettttuuuurrrrnnnn ssssuuuubbbb {{{{ mmmmyyyy $$$$yyyy ==== sssshhhhiiiifffftttt;;;; pppprrrriiiinnnntttt """"$$$$xxxx,,,, $$$$yyyy!!!!\\\\nnnn"""";;;; }}}};;;;
}}}}
$$$$hhhh ==== nnnneeeewwwwpppprrrriiiinnnntttt((((""""HHHHoooowwwwddddyyyy""""))));;;;
$$$$gggg ==== nnnneeeewwwwpppprrrriiiinnnntttt((((""""GGGGrrrreeeeeeeettttiiiinnnnggggssss""""))));;;;
#### TTTTiiiimmmmeeee ppppaaaasssssssseeeessss............
23/Jan/96 perl 5.002 with 3
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
&&&&$$$$hhhh((((""""wwwwoooorrrrlllldddd""""))));;;;
&&&&$$$$gggg((((""""eeeeaaaarrrrtttthhhhlllliiiinnnnggggssss""""))));;;;
This prints
HHHHoooowwwwddddyyyy,,,, wwwwoooorrrrlllldddd!!!!
GGGGrrrreeeeeeeettttiiiinnnnggggssss,,,, eeeeaaaarrrrtttthhhhlllliiiinnnnggggssss!!!!
Note particularly that $$$$xxxx continues to refer to the
value passed into _n_e_w_p_r_i_n_t_(_) _d_e_s_p_i_t_e the fact that the
"my $$$$xxxx" has seemingly gone out of scope by the time
the anonymous subroutine runs. That's what closure is
all about.
This only applies to lexical variables, by the way.
Dynamic variables continue to work as they have always
worked. Closure is not something that most Perl
programmers need trouble themselves about to begin
with.
5. References are often returned by special subroutines
called constructors. Perl objects are just references
to a special kind of object that happens to know which
package it's associated with. Constructors are just
special subroutines that know how to create that
association. They do so by starting with an ordinary
reference, and it remains an ordinary reference even
while it's also being an object. Constructors are
customarily named _n_e_w_(_), but don't have to be:
$$$$oooobbbbjjjjrrrreeeeffff ==== nnnneeeewwww DDDDooooggggggggiiiieeee ((((TTTTaaaaiiiillll ====>>>> ''''sssshhhhoooorrrrtttt'''',,,, EEEEaaaarrrrssss ====>>>> ''''lllloooonnnngggg''''))));;;;
6. References of the appropriate type can spring into
existence if you dereference them in a context that
assumes they exist. Since we haven't talked about
dereferencing yet, we can't show you any examples yet.
7. References to filehandles can be created by taking a
reference to a typeglob. This is currently the best
way to pass filehandles into or out of subroutines, or
to store them in larger data structures.
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>>>>;;;;
}}}}
23/Jan/96 perl 5.002 with 4
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
That's it for creating references. By now you're probably
dying to know how to use references to get back to your
long-lost data. There are several basic methods.
1. Anywhere you'd put an identifier as part of a variable
or subroutine name, you can replace the identifier
with a simple scalar variable containing a reference
of the correct type:
$$$$bbbbaaaarrrr ==== $$$$$$$$ssssccccaaaallllaaaarrrrrrrreeeeffff;;;;
ppppuuuusssshhhh((((@@@@$$$$aaaarrrrrrrraaaayyyyrrrreeeeffff,,,, $$$$ffffiiiilllleeeennnnaaaammmmeeee))));;;;
$$$$$$$$aaaarrrrrrrraaaayyyyrrrreeeeffff[[[[0000]]]] ==== """"JJJJaaaannnnuuuuaaaarrrryyyy"""";;;;
$$$$$$$$hhhhaaaasssshhhhrrrreeeeffff{{{{""""KKKKEEEEYYYY""""}}}} ==== """"VVVVAAAALLLLUUUUEEEE"""";;;;
&&&&$$$$ccccooooddddeeeerrrreeeeffff((((1111,,,,2222,,,,3333))));;;;
pppprrrriiiinnnntttt $$$$gggglllloooobbbbrrrreeeeffff """"oooouuuuttttppppuuuutttt\\\\nnnn"""";;;;
It's important to understand that we are specifically
_N_O_T dereferencing $$$$aaaarrrrrrrraaaayyyyrrrreeeeffff[[[[0000]]]] or $$$$hhhhaaaasssshhhhrrrreeeeffff{{{{""""KKKKEEEEYYYY""""}}}}
there. The dereference of the scalar variable happens
_B_E_F_O_R_E it does any key lookups. Anything more
complicated than a simple scalar variable must use
methods 2 or 3 below. However, a "simple scalar"
includes an identifier that itself uses method 1
recursively. Therefore, the following prints "howdy".
$$$$rrrreeeeffffrrrreeeeffffrrrreeeeffff ==== \\\\\\\\\\\\""""hhhhoooowwwwddddyyyy"""";;;;
pppprrrriiiinnnntttt $$$$$$$$$$$$$$$$rrrreeeeffffrrrreeeeffffrrrreeeeffff;;;;
2. Anywhere you'd put an identifier as part of a variable
or subroutine name, you can replace the identifier
with a BLOCK returning a reference of the correct
type. In other words, the previous examples could be
written like this:
$$$$bbbbaaaarrrr ==== $$$${{{{$$$$ssssccccaaaallllaaaarrrrrrrreeeeffff}}}};;;;
ppppuuuusssshhhh((((@@@@{{{{$$$$aaaarrrrrrrraaaayyyyrrrreeeeffff}}}},,,, $$$$ffffiiiilllleeeennnnaaaammmmeeee))));;;;
$$$${{{{$$$$aaaarrrrrrrraaaayyyyrrrreeeeffff}}}}[[[[0000]]]] ==== """"JJJJaaaannnnuuuuaaaarrrryyyy"""";;;;
$$$${{{{$$$$hhhhaaaasssshhhhrrrreeeeffff}}}}{{{{""""KKKKEEEEYYYY""""}}}} ==== """"VVVVAAAALLLLUUUUEEEE"""";;;;
&&&&{{{{$$$$ccccooooddddeeeerrrreeeeffff}}}}((((1111,,,,2222,,,,3333))));;;;
$$$$gggglllloooobbbbrrrreeeeffff---->>>>pppprrrriiiinnnntttt((((""""oooouuuuttttppppuuuutttt\\\\nnnn""""))));;;; #### iiiiffffffff yyyyoooouuuu uuuusssseeee FFFFiiiilllleeeeHHHHaaaannnnddddlllleeee
Admittedly, it's a little silly to use the curlies in
this case, but the BLOCK can contain any arbitrary
expression, in particular, subscripted expressions:
&&&&{{{{ $$$$ddddiiiissssppppaaaattttcccchhhh{{{{$$$$iiiinnnnddddeeeexxxx}}}} }}}}((((1111,,,,2222,,,,3333))));;;; #### ccccaaaallllllll ccccoooorrrrrrrreeeecccctttt rrrroooouuuuttttiiiinnnneeee
Because of being able to omit the curlies for the
simple case of $$$$$$$$xxxx, people often make the mistake of
viewing the dereferencing symbols as proper operators,
and wonder about their precedence. If they were,
though, you could use parens instead of braces.
That's not the case. Consider the difference below;
23/Jan/96 perl 5.002 with 5
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
case 0 is a short-hand version of case 1, _N_O_T case 2:
$$$$$$$$hhhhaaaasssshhhhrrrreeeeffff{{{{""""KKKKEEEEYYYY""""}}}} ==== """"VVVVAAAALLLLUUUUEEEE"""";;;; #### CCCCAAAASSSSEEEE 0000
$$$${{{{$$$$hhhhaaaasssshhhhrrrreeeeffff}}}}{{{{""""KKKKEEEEYYYY""""}}}} ==== """"VVVVAAAALLLLUUUUEEEE"""";;;; #### CCCCAAAASSSSEEEE 1111
$$$${{{{$$$$hhhhaaaasssshhhhrrrreeeeffff{{{{""""KKKKEEEEYYYY""""}}}}}}}} ==== """"VVVVAAAALLLLUUUUEEEE"""";;;; #### CCCCAAAASSSSEEEE 2222
$$$${{{{$$$$hhhhaaaasssshhhhrrrreeeeffff---->>>>{{{{""""KKKKEEEEYYYY""""}}}}}}}} ==== """"VVVVAAAALLLLUUUUEEEE"""";;;; #### CCCCAAAASSSSEEEE 3333
Case 2 is also deceptive in that you're accessing a
variable called %%%%hhhhaaaasssshhhhrrrreeeeffff, not dereferencing through
$$$$hhhhaaaasssshhhhrrrreeeeffff to the hash it's presumably referencing.
That would be case 3.
3. The case of individual array elements arises often
enough that it gets cumbersome to use method 2. As a
form of syntactic sugar, the two lines like that above
can be written:
$$$$aaaarrrrrrrraaaayyyyrrrreeeeffff---->>>>[[[[0000]]]] ==== """"JJJJaaaannnnuuuuaaaarrrryyyy"""";;;;
$$$$hhhhaaaasssshhhhrrrreeeeffff---->>>>{{{{""""KKKKEEEEYYYY""""}}}} ==== """"VVVVAAAALLLLUUUUEEEE"""";;;;
The left side of the array can be any expression
returning a reference, including a previous
dereference. Note that $$$$aaaarrrrrrrraaaayyyy[[[[$$$$xxxx]]]] is _N_O_T the same
thing as $$$$aaaarrrrrrrraaaayyyy---->>>>[[[[$$$$xxxx]]]] here:
$$$$aaaarrrrrrrraaaayyyy[[[[$$$$xxxx]]]]---->>>>{{{{""""ffffoooooooo""""}}}}---->>>>[[[[0000]]]] ==== """"JJJJaaaannnnuuuuaaaarrrryyyy"""";;;;
This is one of the cases we mentioned earlier in which
references could spring into existence when in an
lvalue context. Before this statement, $$$$aaaarrrrrrrraaaayyyy[[[[$$$$xxxx]]]] may
have been undefined. If so, it's automatically
defined with a hash reference so that we can look up
{{{{""""ffffoooooooo""""}}}} in it. Likewise $$$$aaaarrrrrrrraaaayyyy[[[[$$$$xxxx]]]]---->>>>{{{{""""ffffoooooooo""""}}}} will
automatically get defined with an array reference so
that we can look up [[[[0000]]]] in it.
One more thing here. The arrow is optional _B_E_T_W_E_E_N
brackets subscripts, so you can shrink the above down
to
$$$$aaaarrrrrrrraaaayyyy[[[[$$$$xxxx]]]]{{{{""""ffffoooooooo""""}}}}[[[[0000]]]] ==== """"JJJJaaaannnnuuuuaaaarrrryyyy"""";;;;
Which, in the degenerate case of using only ordinary
arrays, gives you multidimensional arrays just like
C's:
$$$$ssssccccoooorrrreeee[[[[$$$$xxxx]]]][[[[$$$$yyyy]]]][[[[$$$$zzzz]]]] ++++==== 44442222;;;;
Well, okay, not entirely like C's arrays, actually. C
doesn't know how to grow its arrays on demand. Perl
does.
4. If a reference happens to be a reference to an object,
then there are probably methods to access the things
23/Jan/96 perl 5.002 with 6
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
referred to, and you should probably stick to those
methods unless you're in the class package that
defines the object's methods. In other words, be
nice, and don't violate the object's encapsulation
without a very good reason. Perl does not enforce
encapsulation. We are not totalitarians here. We do
expect some basic civility though.
The _r_e_f_(_) operator may be used to determine what type of
thing the reference is pointing to. See the _p_e_r_l_f_u_n_c
manpage.
The _b_l_e_s_s_(_) operator may be used to associate a reference
with a package functioning as an object class. See the
_p_e_r_l_o_b_j manpage.
A typeglob may be dereferenced the same way a reference
can, since the dereference syntax always indicates the
kind of reference desired. So $$$${{{{****ffffoooooooo}}}} and $$$${{{{\\\\$$$$ffffoooooooo}}}} both
indicate the same scalar variable.
Here's a trick for interpolating a subroutine call into a
string:
pppprrrriiiinnnntttt """"MMMMyyyy ssssuuuubbbb rrrreeeettttuuuurrrrnnnneeeedddd @@@@{{{{[[[[mmmmyyyyssssuuuubbbb((((1111,,,,2222,,,,3333))))]]]]}}}} tttthhhhaaaatttt ttttiiiimmmmeeee....\\\\nnnn"""";;;;
The way it works is that when the @@@@{{{{............}}}} is seen in the
double-quoted string, it's evaluated as a block. The
block creates a reference to an anonymous array containing
the results of the call to mmmmyyyyssssuuuubbbb((((1111,,,,2222,,,,3333)))). So the whole
block returns a reference to an array, which is then
dereferenced by @@@@{{{{............}}}} and stuck into the double-quoted
string. This chicanery is also useful for arbitrary
expressions:
pppprrrriiiinnnntttt """"TTTThhhhaaaatttt yyyyeeeeiiiillllddddssss @@@@{{{{[[[[$$$$nnnn ++++ 5555]]]]}}}} wwwwiiiiddddggggeeeettttssss\\\\nnnn"""";;;;
SSSSyyyymmmmbbbboooolllliiiicccc rrrreeeeffffeeeerrrreeeennnncccceeeessss
We said that references spring into existence as necessary
if they are undefined, but we didn't say what happens if a
value used as a reference is already defined, but _I_S_N_'_T a
hard reference. If you use it as a reference in this
case, it'll be treated as a symbolic reference. That is,
the value of the scalar is taken to be the _N_A_M_E of a
variable, rather than a direct link to a (possibly)
anonymous value.
People frequently expect it to work like this. So it
does.
23/Jan/96 perl 5.002 with 7
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
$$$$nnnnaaaammmmeeee ==== """"ffffoooooooo"""";;;;
$$$$$$$$nnnnaaaammmmeeee ==== 1111;;;; #### SSSSeeeettttssss $$$$ffffoooooooo
$$$${{{{$$$$nnnnaaaammmmeeee}}}} ==== 2222;;;; #### SSSSeeeettttssss $$$$ffffoooooooo
$$$${{{{$$$$nnnnaaaammmmeeee xxxx 2222}}}} ==== 3333;;;; #### SSSSeeeettttssss $$$$ffffooooooooffffoooooooo
$$$$nnnnaaaammmmeeee---->>>>[[[[0000]]]] ==== 4444;;;; #### SSSSeeeettttssss $$$$ffffoooooooo[[[[0000]]]]
@@@@$$$$nnnnaaaammmmeeee ==== (((())));;;; #### CCCClllleeeeaaaarrrrssss @@@@ffffoooooooo
&&&&$$$$nnnnaaaammmmeeee(((())));;;; #### CCCCaaaallllllllssss &&&&ffffoooooooo(((()))) ((((aaaassss iiiinnnn PPPPeeeerrrrllll 4444))))
$$$$ppppaaaacccckkkk ==== """"TTTTHHHHAAAATTTT"""";;;;
$$$${{{{""""$$$${{{{ppppaaaacccckkkk}}}}::::::::$$$$nnnnaaaammmmeeee""""}}}} ==== 5555;;;; #### SSSSeeeettttssss $$$$TTTTHHHHAAAATTTT::::::::ffffoooooooo wwwwiiiitttthhhhoooouuuutttt eeeevvvvaaaallll
This is very powerful, and slightly dangerous, in that
it's possible to intend (with the utmost sincerity) to use
a hard reference, and accidentally use a symbolic
reference instead. To protect against that, you can say
uuuusssseeee ssssttttrrrriiiicccctttt ''''rrrreeeeffffssss'''';;;;
and then only hard references will be allowed for the rest
of the enclosing block. An inner block may countermand
that with
nnnnoooo ssssttttrrrriiiicccctttt ''''rrrreeeeffffssss'''';;;;
Only package variables are visible to symbolic references.
Lexical variables (declared with _m_y_(_)) aren't in a symbol
table, and thus are invisible to this mechanism. For
example:
llllooooccccaaaallll(((($$$$vvvvaaaalllluuuueeee)))) ==== 11110000;;;;
$$$$rrrreeeeffff ==== \\\\$$$$vvvvaaaalllluuuueeee;;;;
{{{{
mmmmyyyy $$$$vvvvaaaalllluuuueeee ==== 22220000;;;;
pppprrrriiiinnnntttt $$$$$$$$rrrreeeeffff;;;;
}}}}
This will still print 10, not 20. Remember that _l_o_c_a_l_(_)
affects package variables, which are all "global" to the
package.
NNNNooootttt----ssssoooo----ssssyyyymmmmbbbboooolllliiiicccc rrrreeeeffffeeeerrrreeeennnncccceeeessss
A new feature contributing to readability in 5.001 is that
the brackets around a symbolic reference behave more like
quotes, just as they always have within a string. That
is,
$$$$ppppuuuusssshhhh ==== """"ppppoooopppp oooonnnn """";;;;
pppprrrriiiinnnntttt """"$$$${{{{ppppuuuusssshhhh}}}}oooovvvveeeerrrr"""";;;;
has always meant to print "pop on over", despite the fact
that push is a reserved word. This has been generalized
to work the same outside of quotes, so that
pppprrrriiiinnnntttt $$$${{{{ppppuuuusssshhhh}}}} .... """"oooovvvveeeerrrr"""";;;;
23/Jan/96 perl 5.002 with 8
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
and even
pppprrrriiiinnnntttt $$$${{{{ ppppuuuusssshhhh }}}} .... """"oooovvvveeeerrrr"""";;;;
will have the same effect. (This would have been a syntax
error in 5.000, though Perl 4 allowed it in the spaceless
form.) Note that this construct is _n_o_t considered to be a
symbolic reference when you're using strict refs:
uuuusssseeee ssssttttrrrriiiicccctttt ''''rrrreeeeffffssss'''';;;;
$$$${{{{ bbbbaaaarrrreeeewwwwoooorrrrdddd }}}};;;; #### OOOOkkkkaaaayyyy,,,, mmmmeeeeaaaannnnssss $$$$bbbbaaaarrrreeeewwwwoooorrrrdddd....
$$$${{{{ """"bbbbaaaarrrreeeewwwwoooorrrrdddd"""" }}}};;;; #### EEEErrrrrrrroooorrrr,,,, ssssyyyymmmmbbbboooolllliiiicccc rrrreeeeffffeeeerrrreeeennnncccceeee....
Similarly, because of all the subscripting that is done
using single words, we've applied the same rule to any
bareword that is used for subscripting a hash. So now,
instead of writing
$$$$aaaarrrrrrrraaaayyyy{{{{ """"aaaaaaaaaaaa"""" }}}}{{{{ """"bbbbbbbbbbbb"""" }}}}{{{{ """"cccccccccccc"""" }}}}
you can just write
$$$$aaaarrrrrrrraaaayyyy{{{{ aaaaaaaaaaaa }}}}{{{{ bbbbbbbbbbbb }}}}{{{{ cccccccccccc }}}}
and not worry about whether the subscripts are reserved
words. In the rare event that you do wish to do something
like
$$$$aaaarrrrrrrraaaayyyy{{{{ sssshhhhiiiifffftttt }}}}
you can force interpretation as a reserved word by adding
anything that makes it more than a bareword:
$$$$aaaarrrrrrrraaaayyyy{{{{ sssshhhhiiiifffftttt(((()))) }}}}
$$$$aaaarrrrrrrraaaayyyy{{{{ ++++sssshhhhiiiifffftttt }}}}
$$$$aaaarrrrrrrraaaayyyy{{{{ sssshhhhiiiifffftttt @@@@____ }}}}
The ----wwww switch will warn you if it interprets a reserved
word as a string. But it will no longer warn you about
using lowercase words, since the string is effectively
quoted.
WWWWAAAARRRRNNNNIIIINNNNGGGG
You may not (usefully) use a reference as the key to a
hash. It will be converted into a string:
$$$$xxxx{{{{ \\\\$$$$aaaa }}}} ==== $$$$aaaa;;;;
If you try to dereference the key, it won't do a hard
dereference, and you won't accomplish what you're
attemping. You might want to do something more like
$$$$rrrr ==== \\\\@@@@aaaa;;;;
$$$$xxxx{{{{ $$$$rrrr }}}} ==== $$$$rrrr;;;;
23/Jan/96 perl 5.002 with 9
PERLREF(1) User Contributed Perl Documentation PERLREF(1)
And then at least you can use the _v_a_l_u_e_s_(_), which will be
real refs, instead of the _k_e_y_s_(_), which won't.
SSSSEEEEEEEE AAAALLLLSSSSOOOO
Besides the obvious documents, source code can be
instructive. Some rather pathological examples of the use
of references can be found in the _t_/_o_p_/_r_e_f_._t regression
test in the Perl source directory.
See also the _p_e_r_l_d_s_c manpage and the _p_e_r_l_l_o_l manpage for
how to use references to create complex data structures,
and the _p_e_r_l_o_b_j manpage for how to use them to create
objects.
23/Jan/96 perl 5.002 with 10