in reply to Reduce amount of duplicated code
Assumes no tag nesting:
my %data; while (/\[:([^\]]+)\](.+)\[:\1\]/gis) { $data{$1} = $2; } [download]
Update: Added missing /g