#use Data::Dumper; my %res; while (/(fo.)(.*?)(ba.)/g) { $res{$&} = [ @-[1..3] ]; } print Dumper \%res;