my %KEY_PARSER = ( "number" => { START_COMMAND => qr{number:\s*}i, VALUE_MATCH => qr{\d+}, }, "hair color" => { START_COMMAND => qr{hair colou?r:\s*}i, VALUE_MATCH => qr{[\w\s]+}, }, "height" => { START_COMMAND => qr{height:\s*}i, VALUE_MATCH => qr{\d+}, }, "weight" => { START_COMMAND => qr{weight:\s*}i, VALUE_MATCH => qr{\d+}, }, ); foreach my $line (grep {/\w/} ) { foreach (keys %KEY_PARSER) { while ($line =~ /$KEY_PARSER{$_}{START_COMMAND}/) { $line =~ s/($KEY_PARSER{$_}{START_COMMAND})\s*($KEY_PARSER{$_}{VALUE_MATCH})//; next unless $2; my ($key,$value) = ($1,$2); chomp ($key,$value); print "Found KEY: $key = $value\n"; } } }