in reply to Extra characters problem while parsing a file

Your first input from  while (<FD>) is just  > (the first character of input happens to be your input record delimiter).

The next input starts with  JAVA3_70_303NM:2:1:184:1240, and after you capture this into your $name variable, it is still at the start of the input string (you have not gotten rid of it), so when you do  split /\D+/, those initial digits strings (3, 70, 303, 2, 1, 184, 1240) end up in @numbers.

When you capture the $name value, you want to do it like this:

if ( s/^(\S+)\s+// ) { my $name = $1; ...
That is, remove the "name" string when you capture it.

UPDATE: Added "\s+" to the pattern -- white space should be removed too, in anticipation of the later split /\D+/ so that you don't get an empty string as the first element in @numbers.