use Data::Dumper; use warnings; use strict; my ($item, %warnings); while (defined($_ = )) { if (/^=item (.*)/) { $item = $1; } if (/\(W ([^)]*)\)/) { push @{$warnings{$1}}, $item; } } print Dumper(\%warnings);