develooper Front page | perl.beginners | Postings from February 2002

Re: "Learning Perl" Question

Thread Previous
From:
Michael Fowler
Date:
February 13, 2002 09:10
Subject:
Re: "Learning Perl" Question
Message ID:
20020213170931.GA14669@shoebox.net
On Wed, Feb 13, 2002 at 11:05:51AM -0500, Hanson, Robert wrote:
[snip] 
> In chapter 2 it mentions a rule in Perl: "any time that you need a variable
> in Perl, you can use an assignment instead.  First, Perl does the
> assignment.  Then it uses the variable in whatever way you requested".
> 
> Ok, that makes sense.  It allows you to do things like this:
> 
> chomp( $foo = <STDIN> );
> $x = $y = 10;
[snip]

> The value of a list assignment is a scalar context is the number of
> elements in the **source list** -- in this case, that's 0".
> 
> So this adds to the first rule (sort of).  Basically in scalar context the
> function takes the variable as it's argument, and in list context it takes
> the count of items in the source list.
> 
> ....Ok, that works for me so far, but then why would these work?
> 
> $x = () = 10; # $x is 1
> $x = () = (10, 20); # $x is 2

These match your list assignment rule.  Assigning to empty parens is
assigning to a list (that just happens to be empty).  The assignment to $x
imposes the scalar context.  So, the list assignment "() = (10, 20)"
evaluates to 2 in scalar context.

 
> >From this it sounds like the first rule does not exactly work as stated.  It
> seems that the real rule is that the "=" operator returns a value just like
> any other Perl operator.  It seems to me that given "x = y" that the "="
> operator returns the value from the right side of the operator (in the given
> context of x).

No, it returns the value from the left side.  Assignment is right
associative, which may be what's tripping you up; a string of assignments
are evaluated right to left, instead of left to right as in most algebraic
expressions.  So, in your examples, "() = (10, 20)" is evaluated first, then
the assignment to $x imposes the context.


> So "x = y = z" means that "y = z" returns the value of z, and then "x = "
> stores that value. ...Or at least that is how I am conceptualizing it.

No, in "x = y = z" the expression "y = z" evaluates to y, then x stores that
value.  Consider your chomp example:

    chomp($foo = <STDIN>);

You can't chomp <STDIN>, so the expression must be evaluating to $foo.  And
not just the contents of $foo, $foo itself; chomp requires a scalar it can
modify.


> ....And now the real question.  Why won't this work?
> 
> ($x) = () = 10;

It does work.  $x is getting the first value in the list ().  Consider:

    ($x) = ($y) = 10;

$x now equals 10.  The rightmost list assignment is evaluated in list
context, and the leftmost list is assigned to.  This is list assignment in
list context.

 
> Is there a need for an extra rule to cover this?  Or is there a single rule
> that covers the syntax from all of the above examples?

The assignment and list assignment rules that you've already read about
cover these cases.


Does that help to dispel your confusion?


Michael
--
Administrator                      www.shoebox.net
Programmer, System Administrator   www.gallanttech.com
--

Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About