On Mon, Jul 22, 2002 at 11:13:23PM -0700, nkuipers wrote:
> What I am about to raise, I do so more out of wanting someone to educate me
> than disagreeing for the sake of. The *that syntax shown below is unfamiliar
> to me outside the context of referencing a filehandle in a subroutine params
> list, where it is optional (ie., &some_sub(*STDIN)). *that reminds me an
> awful lot of a C pointer, however. Can someone clear this up for me?
*STDIN and *that are globs, which don't really equate to pointers in C.
Each package variable (or global variable) in Perl gets a slot in a glob.
That glob contains the references to each of the data types.
For example, I say:
$foo = "bar";
$baz = "quux";
There were two globs created as a result of that, *foo and *baz. These
globs can be used to reference those variables.
Now, if I say:
%foo = (key1 => 'value1');
That hash was inserted into a slot of the glob *foo, namely the HASH slot.
So, basically, a glob is a way of referencing any data type by the same
name, be it a hash, array, scalar, etc. The reason you're used to seeing it
with regard to filehandles is because a filehandle doesn't have its own
sigil (such as $, %, @), so you see people often prefix the filehandle with
the *. However, this is generally not necessary, as the Perl builtin
routines that deal with filehandles know how to deal with a bareword as a
filehandle.
The aliasing (*this = *that) works because you're basically telling Perl
that the name "that" is a synonym for "this". So, anytime you say $this it
looks up $that, say @this it looks up @that, and so on. Because of this, I
prefer to target my aliasing by saying *this = \$that; what this does is
alias the scalar slot, but none other. In this case, when you say $this it
looks up $that, but when you say @this it looks up precisely @this.
> I found the following in the Camel 3rd edition, page 257, which, though I may
> be wrong, looks like it does what is requested?
>
> @reflist = \(@x); #interpolate array, then get refs
>
> which looks an awful lot like
>
> @array2 = \(@array1);
Given:
@array1 = qw(foo bar baz quux);
then:
@array2 = \(@array1);
would be equivalent to:
@array2 = (\$array[0], \$array1[1], \$array1[2], \$array1[3]);
Changes to @array1 elements, such as $array1[0] =~ s/f/z/g, would indeed be
reflected in the contents of @array2. However, changes to @array1 itself,
such as adding elements (pop @array1), or setting an index ($array1[2] =
"quuux") would not be reflected in @array2. This is because @array2
contains references to the -elements- of @array1, but it is not an alias for
@array1.
Surely the book explained this.
Michael
--
Administrator www.shoebox.net
Programmer, System Administrator www.gallanttech.com
--
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]