From perldoc perlrun:
-w prints warnings about dubious constructs, such as
variable names that are mentioned only once and
scalar variables that are used before being set,
redefined subroutines, references to undefined file
handles or filehandles opened read-only that you are
attempting to write on, values used as a number that
doesn't look like numbers, using an array as though
it were a scalar, if your subroutines recurse more
than 100 deep, and innumerable other things.
This switch really just enables the internal "^$W"
variable. You can disable or promote into fatal
errors specific warnings using "__WARN__" hooks, as
described in the perlvar manpage and the warn entry
in the perlfunc manpage. See also the perldiag man
page and the perltrap manpage. A new, fine-grained
warning facility is also available if you want to
manipulate entire classes of warnings; see the warn
ings manpage or the perllexwarn manpage.
Adding -w to your code should not affect whether or not your code runs; it should just give you a better idea why when it doesn't.
Another option is to use the use warnings pragma in your code.