квантификаторы в Perl по умолчанию жадные. это означает, что они схватят как можно больше.
то, что вы хотите, это просто:
($username, $domain) = ($string =~ /(.*)@(.*)$/);
Если вы хотите быть на 100% уверены, что вторая часть не имеет @
, вы можете использовать:
($username, $domain) = ($string =~ /(.*)@([^@]*)$/);