develooper Front page | perl.perl5.porters | Postings from July 2010

Re: Order of evaluation of terms (was peephole optimiser could prune more dead code)

Thread Previous | Thread Next
Eric Brine
July 15, 2010 08:52
Re: Order of evaluation of terms (was peephole optimiser could prune more dead code)
Message ID:
On Thu, Jul 15, 2010 at 10:06 AM, David Golden <> wrote:

> On Thu, Jul 15, 2010 at 9:33 AM, demerphq <> wrote:
> >> On the other hand, it may not be documented or specified, but I think
> most
> >> people would expect that in the following, f() is called before g():
> >>    $f() . $g()
> >
> > Hmm. I don't know that I would. If we want this to be the case then
> > IMO we should document it.
> I thought this was actually specified in terms of precedence and
> associativity, but if I read it narrowly as written, it's not.  At
> best it's implied.

Operand evaluation order is only specified for some operators. It's has
nothing to do with precedence or associativity (which is a tie breaker for

Off the top of my head, it is documented for logical operators (to allow
short circuiting), comma operator (to allow it to be used as a semi-colon)
and the flip-flop operator. I also consider it defined for assignment
operators (otherwise local $foo = $foo; wouldn't work) and for =~,

But maybe we can get there by analogy with some identity operations.
> Consider this:
>    q{} . $f() . $g()
> Concatenation is left associative so C<< q{} . $f() >> is evaluated
> first.

So the left "." is evaluated first, but the following does not contradict
the docs:

$ST[0] = g();
$ST[1] = f();
$ST[2] = q{};
$ST[1] = $ST[2] . $ST[1]  # left dot
$ST[0] = $ST[1] . $ST[0]  # right dot

A function call has higher precedence so $f() is evaluated
> before the concatenation.

Functions calls are not on the precedence table. They are considered terms
(not operators) at the grammar level.

- Eric

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About