From: sfryer <[EMAIL PROTECTED]>
> I'm reading perldoc perlref right now and under the Function Templates
> section, I've come across something that's got me stumped. The code in
> question is as follows...
>
> @colors = qw(red blue green yellow orange purple violet);
> for my $name (@colors) {
> no strict 'refs'; # allow symbol table manipulation
> *$name = *{uc $name} = sub { "<FONT COLOR='$name'>@_</FONT>" };
> }
>
> What I'd like to know is what is the purpose/meaning of the "uc" in
> *{uc $name} on the second last line? I couldn't locate an explanation
> for it anywhere.
And you do know what *$name is?
uc() is just an ordinary builtin function that uppercases the string
you give it:
print uc("hello WorLd!\n");
That's not the spicy part. The spicy part is the *. That denotes a
typeglob. And you probably do not really want to know what the heck
is that. In short typeglob is a structure that contains all package
variables, the subroutine, the filehandle and the format of a given
name. So
*$name = sub {...};
creates a function whose name is in the $name variable.
*{uc $name} = sub {...};
creates a function whose name is the uppercased contents of the $name
variable.
The problem is that
*$name = *{uc $name} = sub { "<FONT COLOR='$name'>@_</FONT>" };
is not doing exactly what the author of the code most probably meant.
Try this:
$name = "foo";
*$name = *{uc $name} = sub { "<FONT COLOR='$name'>@_</FONT>" };
print foo(),"\n";
print FOO(),"\n";
# so far so good, but ...
$foo = 5;
print "$FOO\n";
# uh oh
The problem is that the
*foo = *FOO
aliases all parts for the *foo typeglob to their counterparts in
*FOO. So $foo is the same as $FOO, @foo is the same as @FOO, %foo ==
%FOO, filehandle foo is the very same filehandle as FOO, etc.
Jenda
------------------------------------------------------------
All those who understood the topic I just elucidated, please
verticaly extend your upper limbs.
-- Ted Goff
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]