The solution by
Athanasius is already very nice and succinct; it can find all 548 solutions twice as fast (31 seconds instead of 65) if the tests are performed for each digit rather than after all digits have been hashed:
#!/usr/bin/perl -w
use strict;
use warnings;
my $count = 0;
my $start = time;
OUTER:
for my $n (1 .. 987_654_321) {
my %digits;
map { next OUTER if !$_ or $digits{$_}++ or $n % $_ } split //, $n;
printf "#%d is %d\n", ++$count, $n;
($count == 548) and printf "Time: %d sec\n", time - $start;
}
say
substr+lc crypt(qw $i3 SI$),4,5