in reply to grep using substr

The $_ inside the grep{} command, and the $_ you might be using otherwise are two different variables, so don't worry about jumping through hoops to elininate it. This is because $_ is declared to be local to the grep BLOCK.
@sheets = grep{/\.xls$/}readdir(DIR);
This uses a regexp instead, so you don't even see $_.