my $C='((w)hite|(b)lack)'; my @c; my @d; while () { if (/$C\s+"princepawn"/i) { push @c, [ // ]; push @d, [ $1, $2 || $3 ]; } } use Data::Dumper; print Dumper(\@c); # What you said print Dumper(\@d); # ['black', 'b'] or ['white', 'w'] __DATA__ white "princepawn" foo black "princepawn"