in reply to Removing non digits
The i does case insensitive matching and since you are removing all upper and lower case letters it will just slow things down (if it does anything at all)
$n =~ s/\D+//g;
This is closer to what you want. This says remove all groups of things that aren't numbers and the /g says to keep doing it until the string is all gone. The =~ says that what follows is a Regular Expression to be applied to the lvalue ($n in this case). I used $n since that was the looping variable in your foreach.I do not know in this case if \D+ is more efficient than just \D which would remove the non digits one at a time.
Also note that this will modify the values in the array such that it will be changed as a result of the foreach.
Also tr would be faster.
$n =~ tr/0-9//cd;
This says remove from $n anything that isn't a 0-9. c says complement the set given ie not 0-9 and d says delete things in the match list that do not appear in the replacement list.
Update: Oops as noted the searchpattern is already taken to be a character list so the brackets do not work like in a RE. mea culpa