Ответ, что use warnings
можно использовать лексически, является правильным. Решение использовать no warnings
лексически и use warnings
глобально является более правильным. Корректное решение состоит в том, чтобы исправить все ваши предупреждения. Где-то посередине лежит перенаправление ошибок.
use warnings;
open STDERR, ">>", "foo/error.log" or die $!;
Оставьте это на некоторое время, затем выполните:
perl -nlwe '$a{$_}++ }{ print for keys %a' foo/error.log > foo/errors.dedupe
Пройдите код и исправьте предупреждения. Скорее всего, если скрипт работает, они будут тривиальными. Но если вы не проверите, откуда вы знаете?
Если в итоге вы решите, что исправлять все предупреждения не стоит, тогда просто удалите предупреждения и перенаправление ошибок и используйте предупреждения лексически.