From perlsyn:
Simple Statements
The only kind of simple statement is an expression evaluated for its s
+ide-effects. Every simple statement must be terminated with a semicol
+on, unless it is the final statement in a block, in which case the se
+micolon is optional. But put the semicolon in anyway if the block tak
+es up more than one line, because you may eventually add another line
+. Note that there are operators like eval {}, sub {}, and do {} that
+look like compound statements, but aren't--they're just TERMs in an e
+xpression--and thus need an explicit termination when used as the las
+t item in a statement.
So, eval requires the terminating semicolon because it's a simple statement. You're using it for its side effects.
sub, when used in an expression, requires the semicolon as well (eg. my $coderef = sub {...};).