As you have read, one reason your code is finding only V at the end of the string is because your character class matches only one character. [mV] matches either a single small m or a single capital V. To match more than one character you need a quantifier like [mV]+ which will match one or more characters, like m or V or mVm or mV etc.
The other reason is that you have a greedy match before it. .* will match zero or more of any character, so even if you fixed the quantifier on the units and wrote /(.*)([mV]+)/ you would still get 1.9876m and V because the dot is quite happy to match the m, leaving [mv]+ to match just V
Assuming the quantity is numeric, consisting of decimal digits and possibly a decimal point, and the units are always letters (including perhaps a Greek mu μ for micro) then you can split the value like this
use utf8;
use strict;
use warnings 'all';
use v5.10;
use open qw/ :std :encoding(UTF-8) /;
my @splitter = qw/ 1.987mV 442.0μH /;
for ( @splitter ) {
my ($val, $units) = / ([0-9.]+) (\p{Letter}+) /x;
say "$val ~ $units";
}
output
1.987 ~ mV
442.0 ~ μH