in reply to using map to replace text without using a foreach....

map returns the result of its expression and s/// returns either TRUE or FALSE so your array is receiving these true or false values. You need to return $_ after s/// has modified it:
chomp( my @users = map { s/$MAIL_ROOT//; $_ } `find $MAIL_ROOT -type d + -maxdepth 1` );
However what you really should be doing is:
$MAIL_ROOT = '/var/mail'; opendir my $dh, $MAIL_ROOT or die "Cannot open '$MAIL_ROOT' $!"; my @users = grep -d && !/\A\.\.?\z/, readdir $dh; closedir $dh;