All your example have a declaration in the test; so it seems more likely you want to do the assignment than the comparison.
However, Perl doesn't warn on
if ($foo = foo()) {...}
This is actually a common idiom, so it would be wrong for Perl to warn. Note that swapping the arguments around won't help you either:
if (foo() = $foo) {...}
may be valid (if
foo() returns an lvalue). And whether it's valid or not is something you only know at run time - at compile time Perl cannot know whether
foo returns an lvalue or not. So at best, you get a run-time error.
And if you want to compare two variables, there's no defense against mistyping '==' as '=', as both if ($foo = $bar) and if ($foo == $bar) is common.