use strict; use warnings; my $str = q{a,b=c,e=#f,ghi}; my @result = map { my $res; m {(?x) ^ (?(?=([a-z])$) (?{(sub {($res) = @_})->(qq{$1=>fn($1)})}) | (?(?=([a-z])=([a-z])$) (?{(sub {($res) = @_})->(qq{$2=>$3})}) | (?(?=([a-z])=\#([a-z])$) (?{(sub {($res) = @_})->(qq{$4=>fn($5)})}) | (?{(sub {($res) = @_})->(q{???})}) ) ) ) }; $res } split m{,}, $str; print qq{@result\n};