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