in reply to Reduce amount of duplicated code

Assumes no tag nesting:

my %data; while (/\[:([^\]]+)\](.+)\[:\1\]/gis) { $data{$1} = $2; }

Update: Added missing /g