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