use warnings; use strict; my $string = "1:1,2:1,3:2,500:2,505:1"; my (@array, %hash); while ($string =~ /(\d+):(\d+)(?:,|$)/g) { $hash{$1}=$2;push(@array, $1) }; use Data::Dumper; print Dumper(\@array, \%hash);