in reply to Re^3: hangman game
in thread hangman game

Hello QM,

I assume you’re referring to the comma operator in scalar context, which “evaluates its left argument, throws that value away, then evaluates its right argument and returns that value.” (perlop#Comma-Operator).

A quick Google search found this 2010 discussion: http://stackoverflow.com/questions/2200759/when-is-perls-scalar-comma-operator-useful, in which Jonathan Feinberg suggests that the scalar context comma operator is provided for two reasons:

  1. As a hangover from C, because Perl was originally derived from C.
  2. Because it’s useful in cases where you want to execute two or more statements in a syntactic context that allows only a single statement.

Here’s a contrived example:

19:49 >perl -wE "for (my ($i, $j) = (1, 5); $i <= 5; ++$i, --$j) { say + abs($i - $j); }" 4 2 0 2 4 19:49 >

Of course, it is quite possible to re-structure that loop without resorting to use of the comma operator in scalar context. But in Perl’s spirit of TMTOWTDI, the ++$i, --$j syntax is provided for convenience. That’s my take on it, anyway.

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^5: hangman game
by QM (Parson) on May 19, 2015 at 10:18 UTC
    ++$i, --$j
    Yes, that's a good example.

    However, it seems that as long as the sub-expressions are evaluated, it would work the same way:

    for (my ($i, $j) = (1, 5); $i <= 5; ++$i + --$j) { say abs($i - $j); } 4 2 0 2 4

    Which is a bit more unobvious, and not what I was after.

    A do { block; } also works, as would almost anything that evaluated the sub-expressions, and throw the result away. A more complicated variable update would look odd though. Probably better to just use a while loop in that case.

    Are there any other examples that are more difficult to rewrite without the comma operator?

    -QM
    --
    Quantum Mechanics: The dreams stuff is made of