On Wed, Dec 11, 2002 at 11:31:25AM -0800, Rob Richardson wrote:
> Paul,

Hello Rob,

> I am a Perl newbie, but I am employed as a Visual C++ and Visual Basic
> programmer.  I'm having trouble figuring out what your construct is
> doing.  For reference, here it is:
> 
> > @website[
> >             map  $_->[0],
> >             sort { $b->[1] <=> $a->[1] }
> >             map  [ $_, $array[$_] ],
> >             0 .. $#array
> >         ] = 1 .. @array;
> 
> Let me see if I can figure out what this is doing, and I would
> appreciate it if you could fill in the holes.  Hmmm...  On second
> thought, I am more baffled than I thought I was.  Let's see where I can
> get anyway.

You've obviously put a fair bit of effort into this, and you've got most
of it.  Thanks for spending the time on it.

> 1.  "@array" used in numeric context returns the number of elements in
> the array.  So, you are assigning the numbers 1 through n to elements
> of the @website array.  

Yes.  Technically we are assigning to a slice of the array, so it would
be as well to ensure that there is nothing else in the array to start
with.

> 2.  The order in which the elements of the @website array are filled is
> determined by the code within the brackets.  Code within brackets is a
> completely new concept to me.

Yes.  Within the brackets we need a list.  In this case we are using an
expression to generate that list.

> 3.  There are two Perl statements withing @website's brackets, both of
> them being map calls.  I can't explain why there aren't any semicolons
> in there.  If this is incorrect, my second guess is that there is a
> single map statement in there that has another map statement inside it.
>  No, I'm not on the right track.  It's a map that uses a sort that uses
> a map.  

Correct again.  Got there in the end ;-)

> 4.  The innermost map statement is "map  [ $_, $array[$_] ], 0 ..
> $#array.  This is of the "map EXPR, LIST" form, which returns a list
> built by applying the expression to the list.  Aside from knowing that
> $_ is the default argument, I do not know what "[ $_, $array[$_] ]"
> does.

You are correct about the map.  [] creates an anonymous array and
returns a reference to it.  Within this array are two elements: $_, the
index into @array and $array[$_], the element at that index.

So what we are doing is duplicating @array, but with each element we are
also storing its original position in @array.

> 5.  The sort statement sorts the list returned by the inner map from
> highest to lowest value.  I've seen the "$b <=> $a" syntax before (but
> only in a book).  I don't know what the "[1]"s are in there for.

Perl sets $a and $b to be references to the elements of the list to be
compared for the sort.  The list returned from the map is a list of
array references, with the original element of @array in the second
position.  So we need to dereference the array reference and sort on the
second element in the array.  That is what ->[1] does.

<=> is the spaceship operator.  It numerically compares its operands and
returns 0, a negative number or a positiive number depending on the
comparison.  This is just what sort needs.

> 6.  The outer map statement applies "$_->[0]" to the list returned by
> the sort.  I do not know what this means either.

At this point we have our list of array references sorted by the values
in @array.  ->[0] retrieves the original position of the element in
@array that we stored in the first map.  This list of the original
positions defines the slice to which we assign.

> 7.  If we assume an input array of (8, 1, 7, 2, 6, 3, 5, 4), the
> complete statement would first put "1" in $websites[0], then put "2" in
> $websites[2], then put "3" in $websites[4], then put "4" in
> $websites[6], then put "5" in $websites[7], then put "6" in
> $websites[5], then put "7" in $websites[3], and then put "8" in
> $$websites[1].
> 
> OK, how far off am I?

I think the only thing you were missing was the stuff to do with the
array references.

> Thanks!

I realise that was rather throwing you in at the deep end, but I think
you swam ;-)

-- 
Paul Johnson - [EMAIL PROTECTED]
http://www.pjcj.net

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to