... the regex syntax to match 4 or more is not quite right. {4,} should be {4,}?. The first version would just match 4 at a minimum, but no more.
The quantifier {4,} will match as much as possible (while still allowing an overall match), but at least four of the quantified atom. The quantifier (4,}? will match as little as necessary for an overall match, but at least four of the quantified atom.
c:\@Work\Perl\monks>perl -wMstrict -le
"my @strings = qw(vw vwx vwxz vwxzp vwxzpd vwxzpdq);
;;
my $consonant = qr{ [bBcCdDfFgGhHjJkKlLmMnNpPqQrRsStTvVwWxXzZ] }xms;
;;
for my $s (@strings) {
print qq{'$s'};
print qq{{4,} matched; captured '$1'} if $s =~ m{ ($consonant{4,}
+) }xms;
print qq{{4,}? matched; captured '$1'} if $s =~ m{ ($consonant{4,}?
+) }xms;
print '';
}
"
'vw'
'vwx'
'vwxz'
{4,} matched; captured 'vwxz'
{4,}? matched; captured 'vwxz'
'vwxzp'
{4,} matched; captured 'vwxzp'
{4,}? matched; captured 'vwxz'
'vwxzpd'
{4,} matched; captured 'vwxzpd'
{4,}? matched; captured 'vwxz'
'vwxzpdq'
{4,} matched; captured 'vwxzpdq'
{4,}? matched; captured 'vwxz'
See
perlre,
perlretut, and
perlrequick.
Give a man a fish: <%-(-(-(-<