If one does not, it will return an undef value.
No, m// never returns undef. (It could, it just doesn't.)
because it doesn't convert to zero.
No, undef DOES convert to zero when used as a number.
In fact, when undef is or would be converted to a string ("") or number (0) is when you get that and similar warnings.