in reply to Re: hangman game
in thread hangman game

It is optional (but recommended). From Simple Statements:
Every simple statement must be terminated with a semicolon, unless it is the final statement in a block, in which case the semicolon is optional. But put the semicolon in anyway if the block takes up more than one line, because you may eventually add another line.

Replies are listed 'Best First'.
Re^3: hangman game
by laosland (Initiate) on May 18, 2015 at 15:05 UTC
    I sit corrected. I'm relatively new to Perl myself, but like to keep from using some of the shortcuts for readability. Most of my previous experience is with C, C++, COBOL, and a few others...
Re^3: hangman game
by QM (Parson) on May 19, 2015 at 09:04 UTC
    I'm trying to remember the other language where the final semicolon is wrong. Drove me nuts. (Or was this a really old version of Perl? I can't remember.)

    Reminds me of the Comma Operator, which in hindsight seems like a mistake. I've never understood why it's needed, when a semicolon will do. Perhaps someone can point up an example where it's helpful?

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

      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,

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

      I'm trying to remember the other language where the final semicolon is wrong.
      Pascal, at least "earlier versions of" ( Wikipedia supports my recollection). To me, it seemed totally logical at that time, because we were shown the syntax diagrams.
        Pascal, ...
        Yes, probably so. It was a statement separator, and not a terminator. And since a null statement was not allowed, a dangling separator was a syntax error.

        I recall working on various proprietary systems that used a derivative of Pascal (probably because in the beginning "engineers" weren't expected to be "programmers" of any skill). And the implementers took the standard to heart, at least as far as syntax. But adding the Pascalish features, such as records and sets and pointers, was usually left off. So it was often little more than Basic with a different syntax.

        Which also reminds me of one of the TI calculators that was programmable in BASIC (which one?). There was a ROM module that added Pascal -- but it was just a syntax mapper, and was stuck with the BASIC features only.

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

      Perhaps someone can point up an example where it's helpful?

      You will need it to create lists, for one, as in: ( 1, 5, 17 )

      Otherwise it allows you to avoid blocks in unusual places like: do_whatever and log_this, dump_that;

      Cheers, Sören

      Créateur des bugs mobiles - let loose once, run everywhere.
      (hooked on the Perl Programming language)

        You will need it to create lists, for one, as in: ( 1, 5, 17 )
        No, that's a separator. A comma operator essentially says "expression; expression", as best I can tell.

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

      Rust? It returns the last statement's value iff there's no semicolon after it.

        No, nothing as new as Rust.

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