On Wed, Oct 13, 2010 at 12:34:19PM -0700, C.DeRykus wrote:
> On Oct 13, 9:40?am, mike.j...@nethere.com (Mike McClain) wrote:
<snip>
> > > On Wednesday 13 October 2010 06:39:03 Mike McClain wrote:
> > > > Why do @arrays and @seconds not have the same number of elements?
> > > >     my @arrays =
> > > >         map
> > > >         { @{ $HoAoA{$_} } [ 0..$#{ $HoAoA{$_} } ] }
> > > >         keys %HoAoA ;
> >
> > > >     my @seconds =
> > > >         map  { @{ $HoAoA{$_} } [ 0..$#{ $HoAoA{$_} } ]->[1] }
> > > >         keys %HoAoA ;

> > What I still don't understand is why it gives me what it does.
> 
> It's easier to understand what went wrong by reviewing
> the arrow operator (see: perlref)
>             ...
>             $arrayref->[0] = "January";   # Array element
>             $hashref->{"KEY"} = "VALUE";  # Hash element
>             $coderef->(1,2,3);            # Subroutine call
> 
>         The left side of the arrow can be any expression
>         returning  a reference, including a previous deref...
>                           ^^^^^^^^^^

Since @arrays is an array of references it didn't dawn on me that
the '->[1]' would put me in scalar context.

> and the comma operator (see: perlop)
> 
>     Binary "," is the comma operator. In scalar context it
>     evaluates its left argument, throws that value away,
>     then evaluates its right argument and returns that value.
>     ...

This threw me for a loop for a while since there is no comma in
    map  { @{ $HoAoA{$_} } [ 0..$#{ $HoAoA{$_} } ]->[1] } keys %HoAoA;
but I figured out that the range operator '..' returns a list and
eventually found the defination of list in perldata.
I was surprised it didn't show up in perlintro nor in the index of
'Programming Perl' and 'Learning Perl' calls it a 'List Literal' in
chapter 3 which leads to confusion.

> 
> In your case,  the left side is an array slice which
> generates  a list of values. Because the context is
> scalar, the comma operator reduces the expanded
> slice list down to [ qw/bc1 bc2/] for the 2nd key for
> instance. That just  happens to be a reference so
> the arrow operator is happy.  Ditto for the first key
> too:
> 
>      1st key:     [qw/ab1 ab2/]->[1]    ---> ab2
>      2nd key:    [qw/bc1 bc2/ ]->[1]    --->  bc2
> 
> 
> 
> A simpler pair of examples might help:
> 
>  # ok because the comma op reduces the slice to a ref
>  perl -Mstrict -wle "my @a=([1,2],[3,4]);print @a[0..$#a]->[1]"
>  4

This simple example showed me the answer to my question.

Thank you, Sir.
Mike McClain
-- 
Satisfied user of Linux since 1997.
O< ascii ribbon campaign - stop html mail - www.asciiribbon.org

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to