Matching specific amounts of...
Finally, take a look at this :
$_='I am sleepy....zzzz....DING ! Wake Up!';
if (/(z{5})/) {
print "Matched $1\n";
} else {
print "Match failed\n";
}
The braces { } specify how many of the preceding character to match. So
z{2} matches exactly two 'z's and so on. Change z{5} to
z{4} and see how it works. And there's more...
| /z{3}/ | 3 z only |
| /z{3,}/ | At least 3 z |
| /z{1,3}/ | 1 to 3 z |
| /z{4,8}/ | 4 to 8 z |
To any of the above you may suffix an question mark, the effect of which is demonstrated in the following program. Run it a couple of times, inputting 2, 3 and 4:
print "How many letters do you want to match ? ";
chomp($num=<STDIN>);
# we assign and print in one smooth move
print $_="The lowest form of wit is indeed sarcasm, I don't think.\n";
print "Matched \\w{$num,} : $1 \n" if /(\w{$num,})/;
print "Matched \\w{$num,?}: $1 \n" if /(\w{$num,}?)/;
The first match is 'match any word (that's a-Z0-9_) equal to or longer
than $num character, and return it.' So if you
enter 4, then 'lowest' is returned. The word 'The' doesn't match.
The second match is exactly the same, but the ? forces
a minimal match, so only the part actually matched is returned.
Just to clear this up, amend the program thus:
print "\nMatched \\w{$num,} :";
print "$1 " while /(\w{$num,})/g;
print "\nMatched \\w{$num,?} :";
print "$1 " while /(\w{$num,}?)/g;
Note the addition of /g . Try it without -
notice how the match never moves on ?