my $re1 = qr{ ... }msx; my $re2 = qr{ ... }msx; my $big_re = qr{ (?: $re1 | $re2 ) }msx; #### use warnings; use strict; use Data::Dump qw/dd/; # for debugging my $re = qr{ ^ \s* # beginning of line (? \w+ ) # the variable name \s* = \s* # equals (?: # one of the following ( (? \d+ ) # a number | # or (? \w+ ) # a word ) # ) \s* $ # end of line }msx; my @lines = split /\n/, <<'SAMPLE_INPUT'; foo=bar quz = 5 SAMPLE_INPUT for my $line (@lines) { $line =~ $re or die "Failed to parse '$line'"; dd \%+; # debug print "Match! Name: '$+{name}'\n"; if (exists $+{num}) { print "It was a number: '$+{num}'\n" } elsif (exists $+{str}) { print "It was a string: '$+{str}'\n" } else { die "internal error: neither str nor num" } } __END__ { # tied Tie::Hash::NamedCapture name => "foo", str => "bar", } Match! Name: 'foo' It was a string: 'bar' { # tied Tie::Hash::NamedCapture name => "quz", num => 5, } Match! Name: 'quz' It was a number: '5'