use Data::Dumper; my $matches = ospf2_split_database( "no match\n", "Extern 1\n", "Network 1\n", "Stuff for Network 1a\n", "Stuff for Network 1b\n", "Stuff for Network 1c\n", "Network 2\n", "Stuff for Network 2a\n", "Stuff for Network 2b\n", "Router 1\n", "Router 2\n", "Extern 2\n", ); print Dumper $matches->{Network}; sub ospf2_split_database { my %matches; my @ospf2database = @_; my $section; for my $line ( @ospf2database ) { chomp $line; if ( $line =~ m/^(Router|Network|Extern)/ ) { $section = $1 } push @{ $matches{$section} }, $line if $section; } return \%matches; }