В сообщении об ошибке говорится, что вы передаете Date :: Calc неверную дату. Не делай этого. Вы можете использовать функцию check_date для Date :: Calc, чтобы определить, является ли дата действительной.
use Date::Calc qw(Add_Delta_Days check_date Day_of_Week Delta_Days);
$this_day = (check_date($lyear, $month, $day)
? Day_of_Week($lyear, $month, $day)
: 'INVALID');
Исправить недействительные даты сложнее, потому что это зависит от того, как вы получаете недопустимые даты и что вы хотите с ними сделать. Например, если день может быть вне диапазона, и вы хотите исправить 31 апреля - 1 мая, вы можете использовать
($lyear, $month, $day) = Add_Delta_Days($lyear, $month, 1, $day-1);
Но это не исправит неверный год или месяц.