in reply to Double-duty commas
/(\w+):(\w+(?:,\w+)*)(?:,|$)/g does the trick, as seen here:
use Data::Dumper; $_ = 'foo:a,bar:a,b,c,baz:d'; my %data; while (/(\w+):(\w+(?:,\w+)*)(?:,|$)/g) { my $key = $1; my @vals = split(/,/, $2); $data{$key} = \@vals; } # Alternative # =========== # # foreach (split(/,(?=\w+:)/)) { # my ($key, $val) = split(/:/, $_, 2); # my @vals = split(/,/, $val); # $data{$key} = \@vals; # } print(Dumper(\%data)); __END__ output ====== $VAR1 = { 'foo' => [ 'a' ], 'baz' => [ 'd' ], 'bar' => [ 'a', 'b', 'c' ] };
|
---|