On May 29, 2014, at 1:20 PM, James Kerwin wrote:

> Hello all, long time lurker, first time requester...
> 
> I have a Perl exam tomorrow and came across a question that I just cannot 
> find an answer to (past paper, this isn't cheating or homework etc.).
> 
> Explain the difference between:
> 
> ($test)=(@test);
> 
> And
> 
> $test=@test;
> 
> If anybody could shed any light on this I'd be very grateful.

The difference is the "context" of the assignment: "scalar" or "list", and how 
@test (or (@test)) is evaluated in that context.

In the first statement ($test) = (@test), the parentheses around $test in the 
left-hand side (LHS) of the assignment places the evaluation of the right-hand 
side (RHS) in list context. In list context, with two lists on either side of 
the assignment operator (=), assignment is made from each element on the RHS to 
the corresponding element on the LHS. Therefore, the one and only element on 
the LHS ($test) gets assigned the value of the first element of the RHS, and 
$test ends up with the value of $test[0].

In the second statement, the assignment is done in scalar context, and the RHS 
is evaluated in scalar context. A list evaluated in scalar context returns the 
number of elements in the list, and $test is assigned the value ($#test+1).

Note that the parentheses around @test in the first statement are irrelevant. 
The context is list with or without them.

Try it yourself:

% perl -e '@t=qw(1 2 3);$t=@t;print qq($t\n);'
3
% perl -e '@t=qw(1 2 3);($t)=@t;print qq($t\n);'
1
% perl -e '@t=qw(1 2 3);($t)=(@t);print qq($t\n);'
1
 



--
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