in reply to eval with semicolon

For the same reason that you need a semicolon after the end of any other perl statement (e.g. my @array = split /foo/, $string;). eval (despite what it can do) is just a function, and is applied the same as any other. Also note that perldoc -f eval explicitly states that:
"eval BLOCK" does *not* count as a loop, so the loop control statements "next", "last", or "redo" cannot be used to leave or restart the block.
Which emphasizes that eval is just a function and not a condition or looping construct that does not need the semicolon at the end.
Also note that eval can be embedded (just like any function) in a statement as well, just as if($x == eval $y){ ... }.