You're seeing this weird behavior because you have several
variables that point to the same
value; at the time of the first
print, you haven't yet
set that value, so it's undefined. When you set the value
in the next line, it sets that value, so when you do the
second print, they have a value.
Let's step through it:
$test = "scott";
This is self-explanatory--you're just setting a scalar
variable. Later you'll use that value as a symbolic
reference.
$main::{$test} = "skot2";
Here you're manipulating the symbol table; you're saying
that $main::scott should point to the same thing that
$main::skot2 points to. You can do this symbol table
manipulation quite easily, and there's a definite potential
for confusion--for example, there's a difference between
$main::{"scott"} and $main::scott. The first is a symbol
table entry and the second is a scalar variable.
print "As you see, ($scott) and ($main::scott) " .
"aren't here\n";
$scott and $main::scott are the same variable, because
$scott is found in package main, and the second is just
a fully-qualified version of the first. You haven't set a
value for this variable yet. You've modified
$main::{"scott"} but not $main::scott. Perhaps that's
the real source of your confusion?
$$test = "surprise!";
Here's where you set the value. $test is equal to "scott",
so here you're just using symbolic references to change
the value of $scott (which is the same as $main::scott
and points to $skot2). So, it makes sense that, in the next
line...
print "Now ($scott) and ($skot2) and ($main::scott) " .
"have decided to show up\n";
you now have values for your variables.
Does this make sense?
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.