use Data::Dumper; LINE: while (defined($_ = )) { $item = $1 if /^=item (.*)/; push @{$warnings{$1};}, $item if /\(W ([^)]*)\)/; sub END { print Dumper(\%warnings); } ; } #### use Data::Dumper; while (defined($_ = )) { if (/^=item (.*)/) { $item = $1; } if (/\(W ([^)]*)\)/) { push @{$warnings{$1}}, $item; } } print Dumper(\%warnings); #### 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);