Basically, the -w
flag is an all-or-nothing construct. It enables warnings everywhere in your code, including in the modules you use and you haven't written yourself. The use warnings;
pragma, by contrast, is lexically scoped, so it does not overlap on other pieces of code used in your program. And you can turn it on or off for some chunks of code or for some specific warnings categories.
I basically use the -w flag only for one-liners. The use warnings; pragma is much better for all other cases.
See https://perldoc.perl.org/warnings.html#What's-wrong-with-*-w*-and-%24%5eW for more details.