Вы понимаете, что правая сторона вашего || вернет true, так как $ s и $ i не определены и будут рассматриваться как ложные.
Я получил это на моем Mac ...
Name "main::s" used only once: possible typo at ./tmp.pl line 6.
Name "main::i" used only once: possible typo at ./tmp.pl line 6.
как таковое (! $ S &&! $ I) будет истинным, и поэтому вы вводите свой блок 'error'