The \d+ is uneccesary in this line if you are just trying to skip numbers that contains zeroes. /0/ is adequate and infact, this regex misses numbers that end in zero such as 1120, 1130, etc.
The logic on this line is backwards, it should last if the result of % is non-zero, that way you will not have to check through all the number combinations if the first div fails.
Finally, if you are looking for the highest common divisor, you should turn this loop around and start with 9, I would also move it inside the foreach (qw(01 02 13 23)) and do a last if you find a valid divisor for all 4 numbers again stopping you from checking too many combinations.