Stages of a Perl Programmer re: Regular Expressions * Novice - thinks regular expressions are line noise - falls prey to "m/usr/bin/" (embedded /'s in m//) - has no idea what tr/// is - doesn't know about the 'i' modifier - gratuitous use of $`, $&, and $' - doesn't use \w, \d, \s, etc. metaclasses - painfully misuses .* - puts words in character classes * Initiate - still a victim of leaning toothpick syndrome (LTS) - uses regexes where chop() or substr() or index() would do - tries to use tr/// like s/// - uses modifiers needlessly (like 'o' and 's' and 'm') - does ($x,$y) = ($1,$2), instead of ($x,$y) = /(re)g(ex)/ - uses '|' in character classes - uses [^\w] instead of \W - tries to delete HTML tags with s/<.*>//g or s/<.*?>//g - backslashes needlessly * User - uses different m// and s/// delimiters - uses regex where index() would do - knows about tr///, but uses s/// instead - uses regexes in conditionals - knows to use the 'o' modifier, but sometimes gets bitten - uses backreferences incorrectly sometimes (\1 on the RHS of s///) - starts to understand why HTML tags are hard to match with regexes * Adept - knows when to use regexes, and when to use string functions - knows when to use tr///, and when to use s/// - leaves the 'm' off // regexes - uses the 'e' modifier in s/// - toys with look-ahead - knows to use (?:...) when a backref isn't needed - uses precompiled regexes with qr// * Hacker - uses look-ahead and look-behind with impunity - sighs at the constant-width restraint on look-behind - plays with pos() and \G and the 'g' and 'c' modifiers - has read "Mastering Regular Expressions" - knows how to "unroll the loop" - uses re.pm -- and understands the debug output - uses closures to make regex matching objects - makes nested regexes using (??{...}) - can read a regex and explain its function * Guru - works on the regex engine - has patched the engine from time to time - uses precompiled regexes as objects - refers to "Henry" (that is, Henry Spencer) - can explain how any given regex will or won't work * Wizard - adds features to the engine "whenever" - has pumpking status