<?xml version="1.0" encoding="windows-1252"?>
<node id="1003051" title="list assignment to list in scalar context" created="2012-11-08 21:58:18" updated="2012-11-08 21:58:18">
<type id="115">
perlquestion</type>
<author id="961">
Anonymous Monk</author>
<data>
<field name="doctext">
&lt;p&gt;
Hi Monks,
&lt;/p&gt;
&lt;p&gt;
Why does a list assignment to a list in scalar context return the number of elements on the right side list, but NOT the last element of the left side list that has been assigned values? 
&lt;/p&gt;
&lt;p&gt;
I know that:
&lt;/p&gt;
&lt;code&gt;
scalar((1,3,5))     #evaluates to the last element of the list --- 5
if( (5,3,0) )       #evaluates to the last element of the list --- 0, thus evaluates to FALSE
$val=(5,6,7);       #evaluates to the last element of the list --- 7
&lt;/code&gt;
&lt;p&gt;
and that:
&lt;/p&gt;
&lt;code&gt;
$ret = (($i, $j, $k)=(5,6,8,9));        #evaluates to the number of elements on the right side list --- 4
if( ($k, $v) = ( 1, 0 ) )               #evaluates to the number of elements on the right side list --- 2, thus evaluates to TRUE
while ( ($key, $value) = each %map )    #still evaluates to the number of elements on the right side hash
&lt;/code&gt;
&lt;p&gt;
Now check a scalar assignment to a scalar in scalar context:
if( $i = 0 )     
which will evaluate to the value of $i on the left side, thus evaluate to 0, thus evaluate to FALSE
&lt;/p&gt;
&lt;p&gt;
but consider an example of list assignment above:
&lt;code&gt;
if( ($k, $v) = ( 1, 0 ) )          
&lt;/code&gt;
To me, it seems like it should evaluate to the value of list ($k, $v) on the left side just like $i above, thus should evaluate to the last element of list ($k, $v) --- $v, thus evaluate to 0 and at last should evaluate to --- FALSE, although I know the correct answer is it will evaluate to true.
&lt;/p&gt;
&lt;p&gt;
So, the question is: for what purpose are the designing principles of scalar assignment and list assignment both in scalar context completely different? Just for convenience of usage? Isn't that a bit confusing?
&lt;/p&gt;

</field>
<field name="reputation">
18</field>
</data>
</node>
