a2p
accept
access
acct
addftinfo
addr2line
adjtime
afmtodit
after
aio_cancel
aio_error
aio_read
aio_return
aio_suspend
aio_waitcomplete
aio_write
alias
aliases
alloc
anvil
append
apply
apropos
ar
array
as
asa
asn1parse
at
atq
atrm
attemptckalloc
attemptckrealloc
authlib
authtest
autopoint
awk
b64decode
b64encode
basename
batch
bc
bdes
bell
bg
bgerror
biff
big5
binary
bind
bindkey
bindtags
bindtextdomain
bio
bitmap
blowfish
bn
bootparams
bootptab
bounce
brandelf
break
breaksw
brk
bsdiff
bsdtar
bsnmpd
bspatch
bthost
btsockstat
buffer
builtin
builtins
bunzip2
button
byacc
bzcat
bzegrep
bzfgrep
bzgrep
bzip2
c2ph
c89
c99
ca
cal
calendar
canvas
cap_mkdb
case
cat
catch
catman
cc
cd
cdcontrol
chdir
checkbutton
checknr
chflags
chfn
chgrp
chio
chkey
chmod
chown
chpass
chroot
chsh
ci
ciphers
ckalloc
ckdist
ckfree
ckrealloc
cksum
cleanup
clear
clipboard
clock
clock_getres
clock_gettime
clock_settime
close
cmp
co
col
colcrt
colldef
colors
colrm
column
comm
command
compile_et
complete
compress
concat
config
connect
console
continue
core
courierlogger
couriertcpd
cp
cpan
cpio
cpp
creat
crl
crontab
crunchgen
crunchide
crypt
crypto
csh
csplit
ctags
ctm
ctm_dequeue
ctm_rmail
ctm_smail
cu
cursor
cursors
cut
cvs
date
dbiprof
dbiproxy
dc
dcgettext
dcngettext
dd
dde
default
defer
deliverquota
des
destroy
devfs
df
dgettext
dgst
dh
dhparam
dialog
diff
diff3
dig
dir
dirent
dirname
dirs
discard
disktab
dngettext
do
domainname
done
dprofpp
dsa
dsaparam
dtmfdecode
du
dup
dup2
eaccess
ec
ecdsa
echo
echotc
ecparam
ed
edit
editrc
ee
egrep
elf
elfdump
elif
else
enc
enc2xs
encoding
end
endif
endsw
engine
enigma
entry
env
envsubst
eof
eqn
err
errno
error
errstr
esac
ethers
euc
eui64
eval
event
evp
ex
exec
execve
exit
expand
export
exports
expr
extattr
extattr_delete_fd
extattr_delete_file
extattr_get_fd
extattr_get_file
extattr_set_fd
extattr_set_file
f77
false
famm
famx
fblocked
fbtab
fc
fchdir
fchflags
fchmod
fchown
fcntl
fconfigure
fcopy
fdescfs
fdformat
fdread
fdwrite
fetch
fg
fgrep
fhopen
fhstat
fhstatfs
fi
file
file2c
fileevent
filename
filetest
find
find2perl
finger
flex
flock
flush
fmt
focus
fold
font
fontedit
for
foreach
fork
format
forward
fpathconf
frame
from
fs
fstab
fstat
fstatfs
fsync
ftp
ftpchroot
ftpusers
ftruncate
futimes
g711conv
gb2312
gb18030
gbk
gcc
gcore
gcov
gdb
gencat
gendsa
genrsa
gensnmptree
getconf
getdents
getdirentries
getdtablesize
getegid
geteuid
getfacl
getfh
getfsstat
getgid
getgroups
getitimer
getlogin
getopt
getopts
getpeername
getpgid
getpgrp
getpid
getppid
getpriority
getresgid
getresuid
getrlimit
getrusage
gets
getsid
getsockname
getsockopt
gettext
gettextize
gettimeofday
gettytab
getuid
glob
global
gmake
goto
gperf
gprof
grab
grep
grid
grn
grodvi
groff
groff_font
groff_out
groff_tmac
grog
grolbp
grolj4
grops
grotty
group
groups
gunzip
gzcat
gzexe
gzip
h2ph
h2xs
hash
hashstat
hd
head
help2man
hesinfo
hexdump
history
host
hostname
hosts
hosts_access
hosts_options
hpftodit
http
hup
i386_get_ioperm
i386_get_ldt
i386_set_ioperm
i386_set_ldt
i386_vm86
iconv
id
ident
idprio
if
ifnames253
ifnames259
image
imapd
incr
indent
indxbib
info
infokey
inode
install
instmodsh
interp
intro
introduction
ioctl
ipcrm
ipcs
ipf
ipftest
ipnat
ippool
ipresend
issetugid
jail
jail_attach
jobid
jobs
join
jot
kbdcontrol
kbdmap
kcon
kdestroy
kdump
kenv
kevent
keycap
keylogin
keylogout
keymap
keysyms
kgdb
kill
killall
killpg
kinit
kldfind
kldfirstmod
kldload
kldnext
kldstat
kldsym
kldunload
klist
kpasswd
kqueue
kse
kse_create
kse_exit
kse_release
kse_switchin
kse_thr_interrupt
kse_wakeup
ktrace
label
labelframe
lam
lappend
last
lastcomm
lastlog
lchflags
lchmod
lchown
ld
ldap
ldapadd
ldapcompare
ldapdelete
ldapmodify
ldapmodrdn
ldappasswd
ldapsearch
ldapwhoami
ldd
leave
less
lesskey
lex
lgetfh
lhash
libnetcfg
library
limit
limits
lindex
link
linprocfs
linsert
lint
lio_listio
list
listbox
listen
lj4_font
lkbib
llength
lmtp
ln
load
loadfont
local
locale
locate
lock
lockf
log
logger
login
logins
logname
logout
look
lookbib
lorder
lower
lp
lpq
lpr
lprm
lptest
lrange
lreplace
ls
lsearch
lseek
lset
lsort
lstat
lsvfs
lutimes
lynx
m4
madvise
magic
mail
maildiracl
maildirkw
maildirmake
mailq
mailx
make
makeinfo
makewhatis
man
manpath
master
mc
mcedit
mcview
md2
md4
md5
mdc2
memory
menu
menubar
menubutton
merge
mesg
message
mincore
minherit
minigzip
mkdep
mkdir
mkfifo
mkimapdcert
mklocale
mknod
mkpop3dcert
mkstr
mktemp
mlock
mlockall
mmap
mmroff
modfind
modfnext
modnext
modstat
moduli
more
motd
mount
mprotect
mptable
msdos
msdosfs
msgattrib
msgcat
msgcmp
msgcomm
msgconv
msgen
msgexec
msgfilter
msgfmt
msggrep
msginit
msgmerge
msgs
msgunfmt
msguniq
mskanji
msql2mysql
msync
mt
munlock
munlockall
munmap
mv
myisamchk
myisamlog
myisampack
mysql
mysqlaccess
mysqladmin
mysqlbinlog
mysqlcheck
mysqld
mysqldump
mysqld_multi
mysqld_safe
mysqlhotcopy
mysqlimport
mysqlshow
mysql_config
mysql_fix_privilege_tables
mysql_zap
namespace
nanosleep
nawk
nc
ncal
ncplist
ncplogin
ncplogout
neqn
netconfig
netgroup
netid
netstat
networks
newaliases
newgrp
nex
nfsstat
nfssvc
ngettext
nice
nl
nm
nmount
nohup
nologin
notify
nroff
nseq
nslookup
ntp_adjtime
ntp_gettime
nvi
nview
objcopy
objdump
objformat
ocsp
od
onintr
open
openssl
opieaccess
opieinfo
opiekey
opiekeys
opiepasswd
option
options
oqmgr
pack
package
packagens
pagesize
palette
pam_auth
panedwindow
parray
passwd
paste
patch
pathchk
pathconf
pawd
pax
pbm
pcre
pcreapi
pcrebuild
pcrecallout
pcrecompat
pcrecpp
pcregrep
pcrematching
pcrepartial
pcrepattern
pcreperform
pcreposix
pcreprecompile
pcresample
pcretest
perl
perl56delta
perl58delta
perl561delta
perl570delta
perl571delta
perl572delta
perl573delta
perl581delta
perl582delta
perl583delta
perl584delta
perl585delta
perl586delta
perl587delta
perl588delta
perl5004delta
perl5005delta
perlaix
perlamiga
perlapi
perlapio
perlapollo
perlartistic
perlbeos
perlbook
perlboot
perlbot
perlbs2000
perlbug
perlcall
perlcc
perlce
perlcheat
perlclib
perlcn
perlcompile
perlcygwin
perldata
perldbmfilter
perldebguts
perldebtut
perldebug
perldelta
perldgux
perldiag
perldoc
perldos
perldsc
perlebcdic
perlembed
perlepoc
perlfaq
perlfaq1
perlfaq2
perlfaq3
perlfaq4
perlfaq5
perlfaq6
perlfaq7
perlfaq8
perlfaq9
perlfilter
perlfork
perlform
perlfreebsd
perlfunc
perlglossary
perlgpl
perlguts
perlhack
perlhist
perlhpux
perlhurd
perlintern
perlintro
perliol
perlipc
perlirix
perlivp
perljp
perlko
perllexwarn
perllinux
perllocale
perllol
perlmachten
perlmacos
perlmacosx
perlmint
perlmod
perlmodinstall
perlmodlib
perlmodstyle
perlmpeix
perlnetware
perlnewmod
perlnumber
perlobj
perlop
perlopenbsd
perlopentut
perlos2
perlos390
perlos400
perlothrtut
perlpacktut
perlplan9
perlpod
perlpodspec
perlport
perlqnx
perlre
perlref
perlreftut
perlrequick
perlreref
perlretut
perlrun
perlsec
perlsolaris
perlstyle
perlsub
perlsyn
perlthrtut
perltie
perltoc
perltodo
perltooc
perltoot
perltrap
perltru64
perltw
perlunicode
perluniintro
perlutil
perluts
perlvar
perlvmesa
perlvms
perlvos
perlwin32
perlxs
perlxstut
perror
pfbtops
pftp
pgrep
phones
photo
pic
pickup
piconv
pid
pipe
pkcs7
pkcs8
pkcs12
pkg_add
pkg_check
pkg_create
pkg_delete
pkg_info
pkg_sign
pkg_version
pkill
pl2pm
place
pod2html
pod2latex
pod2man
pod2text
pod2usage
podchecker
podselect
poll
popd
popup
posix_madvise
postalias
postcat
postconf
postdrop
postfix
postkick
postlock
postlog
postmap
postqueue
postsuper
pr
pread
preadv
printcap
printenv
printf
proc
procfs
profil
protocols
prove
proxymap
ps
psed
psroff
pstruct
ptrace
publickey
pushd
puts
pwd
pwrite
pwritev
qmgr
qmqpd
quota
quotactl
radiobutton
raise
rand
ranlib
rcp
rcs
rcsclean
rcsdiff
rcsfile
rcsfreeze
rcsintro
rcsmerge
read
readelf
readlink
readonly
readv
realpath
reboot
recv
recvfrom
recvmsg
red
ree
refer
regexp
registry
regsub
rehash
remote
rename
repeat
replace
req
reset
resolver
resource
return
rev
revoke
rfcomm_sppd
rfork
rhosts
ripemd
ripemd160
rlog
rlogin
rm
rmd160
rmdir
rpc
rpcgen
rs
rsa
rsautl
rsh
rtld
rtprio
rup
ruptime
rusers
rwall
rwho
s2p
safe
sasl
sasldblistusers2
saslpasswd2
sbrk
scache
scale
scan
sched
sched_getparam
sched_getscheduler
sched_get_priority_max
sched_get_priority_min
sched_rr_get_interval
sched_setparam
sched_setscheduler
sched_yield
scon
scp
script
scrollbar
sdiff
sed
seek
select
selection
semctl
semget
semop
send
sendbug
sendfile
sendmail
sendmsg
sendto
services
sess_id
set
setegid
setenv
seteuid
setfacl
setgid
setgroups
setitimer
setlogin
setpgid
setpgrp
setpriority
setregid
setresgid
setresuid
setreuid
setrlimit
setsid
setsockopt
settc
settimeofday
setty
setuid
setvar
sftp
sh
sha
sha1
sha256
shar
shells
shift
shmat
shmctl
shmdt
shmget
showq
shutdown
sigaction
sigaltstack
sigblock
sigmask
sigpause
sigpending
sigprocmask
sigreturn
sigsetmask
sigstack
sigsuspend
sigvec
sigwait
size
slapadd
slapcat
slapd
slapdn
slapindex
slappasswd
slaptest
sleep
slogin
slurpd
smbutil
smime
smtp
smtpd
socket
socketpair
sockstat
soelim
sort
source
spawn
speed
spinbox
spkac
splain
split
squid
squid_ldap_auth
squid_ldap_group
squid_unix_group
sscop
ssh
sshd_config
ssh_config
stab
startslip
stat
statfs
stop
string
strings
strip
stty
su
subst
sum
suspend
swapoff
swapon
switch
symlink
sync
sysarch
syscall
sysconftool
sysconftoolcheck
systat
s_client
s_server
s_time
tabs
tail
talk
tar
tbl
tclsh
tcltest
tclvars
tcopy
tcpdump
tcpslice
tcsh
tee
tell
telltc
telnet
term
termcap
terminfo
test
texindex
texinfo
text
textdomain
tfmtodit
tftp
then
threads
time
tip
tk
tkerror
tkvars
tkwait
tlsmgr
tmac
top
toplevel
touch
tput
tr
trace
trafshow
trap
troff
true
truncate
truss
tset
tsort
tty
ttys
type
tzfile
ui
ul
ulimit
umask
unalias
uname
uncomplete
uncompress
undelete
unexpand
unhash
unifdef
unifdefall
uniq
units
unknown
unlimit
unlink
unmount
unset
unsetenv
until
unvis
update
uplevel
uptime
upvar
usbhidaction
usbhidctl
users
utf8
utimes
utmp
utrace
uudecode
uuencode
uuidgen
vacation
variable
verify
version
vfork
vgrind
vgrindefs
vi
vidcontrol
vidfont
view
virtual
vis
vt220keys
vwait
w
wait
wait3
wait4
waitpid
wall
wc
wget
what
whatis
where
whereis
which
while
who
whoami
whois
window
winfo
wish
wm
write
writev
wtmp
x509
xargs
xgettext
xmlwf
xstr
xsubpp
yacc
yes
ypcat
ypchfn
ypchpass
ypchsh
ypmatch
yppasswd
ypwhich
yyfix
zcat
zcmp
zdiff
zegrep
zfgrep
zforce
zgrep
zmore
znew
_exit
__syscall
 
FreeBSD/Linux/UNIX General Commands Manual
Hypertext Man Pages
perlre
 
PERLRE(1)	       Perl Programmers Reference Guide 	     PERLRE(1)



NAME
       perlre - Perl regular expressions

DESCRIPTION
       This page describes the syntax of regular expressions in Perl.

       If you haven't used regular expressions before, a quick-start introduc-
       tion is available in perlrequick, and a longer tutorial introduction is
       available in perlretut.

       For reference on how regular expressions are used in matching opera-
       tions, plus various examples of the same, see discussions of "m//",
       "s///", "qr//" and "??" in "Regexp Quote-Like Operators" in perlop.

       Matching operations can have various modifiers.	Modifiers that relate
       to the interpretation of the regular expression inside are listed
       below.  Modifiers that alter the way a regular expression is used by
       Perl are detailed in "Regexp Quote-Like Operators" in perlop and "Gory
       details of parsing quoted constructs" in perlop.

       i   Do case-insensitive pattern matching.

	   If "use locale" is in effect, the case map is taken from the cur-
	   rent locale.  See perllocale.

       m   Treat string as multiple lines.  That is, change "^" and "$" from
	   matching the start or end of the string to matching the start or
	   end of any line anywhere within the string.

       s   Treat string as single line.  That is, change "." to match any
	   character whatsoever, even a newline, which normally it would not
	   match.

	   The "/s" and "/m" modifiers both override the $* setting.  That is,
	   no matter what $* contains, "/s" without "/m" will force "^" to
	   match only at the beginning of the string and "$" to match only at
	   the end (or just before a newline at the end) of the string.
	   Together, as /ms, they let the "." match any character whatsoever,
	   while still allowing "^" and "$" to match, respectively, just after
	   and just before newlines within the string.

       x   Extend your pattern's legibility by permitting whitespace and com-
	   ments.

       These are usually written as "the "/x" modifier", even though the
       delimiter in question might not really be a slash.  Any of these modi-
       fiers may also be embedded within the regular expression itself using
       the "(?...)" construct.	See below.

       The "/x" modifier itself needs a little more explanation.  It tells the
       regular expression parser to ignore whitespace that is neither back-
       slashed nor within a character class.  You can use this to break up
       your regular expression into (slightly) more readable parts.  The "#"
       character is also treated as a metacharacter introducing a comment,
       just as in ordinary Perl code.  This also means that if you want real
       whitespace or "#" characters in the pattern (outside a character class,
       where they are unaffected by "/x"), that you'll either have to escape
       them or encode them using octal or hex escapes.	Taken together, these
       features go a long way towards making Perl's regular expressions more
       readable.  Note that you have to be careful not to include the pattern
       delimiter in the comment--perl has no way of knowing you did not intend
       to close the pattern early.  See the C-comment deletion code in perlop.

       Regular Expressions

       The patterns used in Perl pattern matching derive from supplied in the
       Version 8 regex routines.  (The routines are derived (distantly) from
       Henry Spencer's freely redistributable reimplementation of the V8 rou-
       tines.)	See "Version 8 Regular Expressions" for details.

       In particular the following metacharacters have their standard
       egrep-ish meanings:

	   \   Quote the next metacharacter
	   ^   Match the beginning of the line
	   .   Match any character (except newline)
	   $   Match the end of the line (or before newline at the end)
	   |   Alternation
	   ()  Grouping
	   []  Character class

       By default, the "^" character is guaranteed to match only the beginning
       of the string, the "$" character only the end (or before the newline at
       the end), and Perl does certain optimizations with the assumption that
       the string contains only one line.  Embedded newlines will not be
       matched by "^" or "$".  You may, however, wish to treat a string as a
       multi-line buffer, such that the "^" will match after any newline
       within the string, and "$" will match before any newline.  At the cost
       of a little more overhead, you can do this by using the /m modifier on
       the pattern match operator.  (Older programs did this by setting $*,
       but this practice is now deprecated.)

       To simplify multi-line substitutions, the "." character never matches a
       newline unless you use the "/s" modifier, which in effect tells Perl to
       pretend the string is a single line--even if it isn't.  The "/s" modi-
       fier also overrides the setting of $*, in case you have some (badly
       behaved) older code that sets it in another module.

       The following standard quantifiers are recognized:

	   *	  Match 0 or more times
	   +	  Match 1 or more times
	   ?	  Match 1 or 0 times
	   {n}	  Match exactly n times
	   {n,}   Match at least n times
	   {n,m}  Match at least n but not more than m times

       (If a curly bracket occurs in any other context, it is treated as a
       regular character.  In particular, the lower bound is not optional.)
       The "*" modifier is equivalent to "{0,}", the "+" modifier to "{1,}",
       and the "?" modifier to "{0,1}".  n and m are limited to integral val-
       ues less than a preset limit defined when perl is built.  This is usu-
       ally 32766 on the most common platforms.  The actual limit can be seen
       in the error message generated by code such as this:

	   $_ **= $_ , / {$_} / for 2 .. 42;

       By default, a quantified subpattern is "greedy", that is, it will match
       as many times as possible (given a particular starting location) while
       still allowing the rest of the pattern to match.  If you want it to
       match the minimum number of times possible, follow the quantifier with
       a "?".  Note that the meanings don't change, just the "greediness":

	   *?	  Match 0 or more times
	   +?	  Match 1 or more times
	   ??	  Match 0 or 1 time
	   {n}?   Match exactly n times
	   {n,}?  Match at least n times
	   {n,m}? Match at least n but not more than m times

       Because patterns are processed as double quoted strings, the following
       also work:

	   \t	       tab		     (HT, TAB)
	   \n	       newline		     (LF, NL)
	   \r	       return		     (CR)
	   \f	       form feed	     (FF)
	   \a	       alarm (bell)	     (BEL)
	   \e	       escape (think troff)  (ESC)
	   \033        octal char (think of a PDP-11)
	   \x1B        hex char
	   \x{263a}    wide hex char	     (Unicode SMILEY)
	   \c[	       control char
	   \N{name}    named char
	   \l	       lowercase next char (think vi)
	   \u	       uppercase next char (think vi)
	   \L	       lowercase till \E (think vi)
	   \U	       uppercase till \E (think vi)
	   \E	       end case modification (think vi)
	   \Q	       quote (disable) pattern metacharacters till \E

       If "use locale" is in effect, the case map used by "\l", "\L", "\u" and
       "\U" is taken from the current locale.  See perllocale.	For documenta-
       tion of "\N{name}", see charnames.

       You cannot include a literal "$" or "@" within a "\Q" sequence.	An
       unescaped "$" or "@" interpolates the corresponding variable, while
       escaping will cause the literal string "\$" to be matched.  You'll need
       to write something like "m/\Quser\E\@\Qhost/".

       In addition, Perl defines the following:

	   \w  Match a "word" character (alphanumeric plus "_")
	   \W  Match a non-"word" character
	   \s  Match a whitespace character
	   \S  Match a non-whitespace character
	   \d  Match a digit character
	   \D  Match a non-digit character
	   \pP Match P, named property.  Use \p{Prop} for longer names.
	   \PP Match non-P
	   \X  Match eXtended Unicode "combining character sequence",
	       equivalent to (?:\PM\pM*)
	   \C  Match a single C char (octet) even under Unicode.
	       NOTE: breaks up characters into their UTF-8 bytes,
	       so you may end up with malformed pieces of UTF-8.
	       Unsupported in lookbehind.

       A "\w" matches a single alphanumeric character (an alphabetic charac-
       ter, or a decimal digit) or "_", not a whole word.  Use "\w+" to match
       a string of Perl-identifier characters (which isn't the same as match-
       ing an English word).  If "use locale" is in effect, the list of alpha-
       betic characters generated by "\w" is taken from the current locale.
       See perllocale.	You may use "\w", "\W", "\s", "\S", "\d", and "\D"
       within character classes, but if you try to use them as endpoints of a
       range, that's not a range, the "-" is understood literally.  If Unicode
       is in effect, "\s" matches also "\x{85}", "\x{2028}, and "\x{2029}",
       see perlunicode for more details about "\pP", "\PP", and "\X", and per-
       luniintro about Unicode in general.  You can define your own "\p" and
       "\P" properties, see perlunicode.

       The POSIX character class syntax

	   [:class:]

       is also available.  The available classes and their backslash equiva-
       lents (if available) are as follows:

	   alpha
	   alnum
	   ascii
	   blank	       [1]
	   cntrl
	   digit       \d
	   graph
	   lower
	   print
	   punct
	   space       \s      [2]
	   upper
	   word        \w      [3]
	   xdigit

       [1] A GNU extension equivalent to "[ \t]", "all horizontal whitespace".

       [2] Not exactly equivalent to "\s" since the "[[:space:]]" includes
	   also the (very rare) "vertical tabulator", "\ck", chr(11).

       [3] A Perl extension, see above.

       For example use "[:upper:]" to match all the uppercase characters.
       Note that the "[]" are part of the "[::]" construct, not part of the
       whole character class.  For example:

	   [01[:alpha:]%]

       matches zero, one, any alphabetic character, and the percentage sign.

       The following equivalences to Unicode \p{} constructs and equivalent
       backslash character classes (if available), will hold:

	   [:...:]     \p{...}	       backslash

	   alpha       IsAlpha
	   alnum       IsAlnum
	   ascii       IsASCII
	   blank       IsSpace
	   cntrl       IsCntrl
	   digit       IsDigit	      \d
	   graph       IsGraph
	   lower       IsLower
	   print       IsPrint
	   punct       IsPunct
	   space       IsSpace
		       IsSpacePerl    \s
	   upper       IsUpper
	   word        IsWord
	   xdigit      IsXDigit

       For example "[:lower:]" and "\p{IsLower}" are equivalent.

       If the "utf8" pragma is not used but the "locale" pragma is, the
       classes correlate with the usual isalpha(3) interface (except for
       "word" and "blank").

       The assumedly non-obviously named classes are:

       cntrl
	   Any control character.  Usually characters that don't produce out-
	   put as such but instead control the terminal somehow: for example
	   newline and backspace are control characters.  All characters with
	   ord() less than 32 are most often classified as control characters
	   (assuming ASCII, the ISO Latin character sets, and Unicode), as is
	   the character with the ord() value of 127 ("DEL").

       graph
	   Any alphanumeric or punctuation (special) character.

       print
	   Any alphanumeric or punctuation (special) character or the space
	   character.

       punct
	   Any punctuation (special) character.

       xdigit
	   Any hexadecimal digit.  Though this may feel silly ([0-9A-Fa-f]
	   would work just fine) it is included for completeness.

       You can negate the [::] character classes by prefixing the class name
       with a '^'. This is a Perl extension.  For example:

	   POSIX       traditional Unicode

	   [:^digit:]	   \D	   \P{IsDigit}
	   [:^space:]	   \S	   \P{IsSpace}
	   [:^word:]	   \W	   \P{IsWord}

       Perl respects the POSIX standard in that POSIX character classes are
       only supported within a character class.  The POSIX character classes
       [.cc.] and [=cc=] are recognized but not supported and trying to use
       them will cause an error.

       Perl defines the following zero-width assertions:

	   \b  Match a word boundary
	   \B  Match a non-(word boundary)
	   \A  Match only at beginning of string
	   \Z  Match only at end of string, or before newline at the end
	   \z  Match only at end of string
	   \G  Match only at pos() (e.g. at the end-of-match position
	       of prior m//g)

       A word boundary ("\b") is a spot between two characters that has a "\w"
       on one side of it and a "\W" on the other side of it (in either order),
       counting the imaginary characters off the beginning and end of the
       string as matching a "\W".  (Within character classes "\b" represents
       backspace rather than a word boundary, just as it normally does in any
       double-quoted string.)  The "\A" and "\Z" are just like "^" and "$",
       except that they won't match multiple times when the "/m" modifier is
       used, while "^" and "$" will match at every internal line boundary.  To
       match the actual end of the string and not ignore an optional trailing
       newline, use "\z".

       The "\G" assertion can be used to chain global matches (using "m//g"),
       as described in "Regexp Quote-Like Operators" in perlop.  It is also
       useful when writing "lex"-like scanners, when you have several patterns
       that you want to match against consequent substrings of your string,
       see the previous reference.  The actual location where "\G" will match
       can also be influenced by using "pos()" as an lvalue: see "pos" in
       perlfunc. Currently "\G" is only fully supported when anchored to the
       start of the pattern; while it is permitted to use it elsewhere, as in
       "/(?<=\G..)./g", some such uses ("/.\G/g", for example) currently cause
       problems, and it is recommended that you avoid such usage for now.

       The bracketing construct "( ... )" creates capture buffers.  To refer
       to the digit'th buffer use \ within the match.  Outside the
       match use "$" instead of "\".  (The \ notation works in certain
       circumstances outside the match.  See the warning below about \1 vs $1
       for details.)  Referring back to another part of the match is called a
       backreference.

       There is no limit to the number of captured substrings that you may
       use.  However Perl also uses \10, \11, etc. as aliases for \010, \011,
       etc.  (Recall that 0 means octal, so \011 is the character at number 9
       in your coded character set; which would be the 10th character, a hori-
       zontal tab under ASCII.)  Perl resolves this ambiguity by interpreting
       \10 as a backreference only if at least 10 left parentheses have opened
       before it.  Likewise \11 is a backreference only if at least 11 left
       parentheses have opened before it.  And so on.  \1 through \9 are
       always interpreted as backreferences.

       Examples:

	   s/^([^ ]*) *([^ ]*)/$2 $1/;	   # swap first two words

	    if (/(.)\1/) {		   # find first doubled char
		print "'$1' is the first doubled character\n";
	    }

	   if (/Time: (..):(..):(..)/) {   # parse out values
	       $hours = $1;
	       $minutes = $2;
	       $seconds = $3;
	   }

       Several special variables also refer back to portions of the previous
       match.  $+ returns whatever the last bracket match matched.  $& returns
       the entire matched string.  (At one point $0 did also, but now it
       returns the name of the program.)  $` returns everything before the
       matched string.	$' returns everything after the matched string. And
       $^N contains whatever was matched by the most-recently closed group
       (submatch). $^N can be used in extended patterns (see below), for exam-
       ple to assign a submatch to a variable.

       The numbered match variables ($1, $2, $3, etc.) and the related punctu-
       ation set ($+, $&, $`, $', and $^N) are all dynamically scoped until
       the end of the enclosing block or until the next successful match,
       whichever comes first.  (See "Compound Statements" in perlsyn.)

       NOTE: failed matches in Perl do not reset the match variables, which
       makes it easier to write code that tests for a series of more specific
       cases and remembers the best match.

       WARNING: Once Perl sees that you need one of $&, $`, or $' anywhere in
       the program, it has to provide them for every pattern match.  This may
       substantially slow your program.  Perl uses the same mechanism to pro-
       duce $1, $2, etc, so you also pay a price for each pattern that con-
       tains capturing parentheses.  (To avoid this cost while retaining the
       grouping behaviour, use the extended regular expression "(?: ... )"
       instead.)  But if you never use $&, $` or $', then patterns without
       capturing parentheses will not be penalized.  So avoid $&, $', and $`
       if you can, but if you can't (and some algorithms really appreciate
       them), once you've used them once, use them at will, because you've
       already paid the price.	As of 5.005, $& is not so costly as the other
       two.

       Backslashed metacharacters in Perl are alphanumeric, such as "\b",
       "\w", "\n".  Unlike some other regular expression languages, there are
       no backslashed symbols that aren't alphanumeric.  So anything that
       looks like \\, \(, \), \<, \>, \{, or \} is always interpreted as a
       literal character, not a metacharacter.	This was once used in a common
       idiom to disable or quote the special meanings of regular expression
       metacharacters in a string that you want to use for a pattern. Simply
       quote all non-"word" characters:

	   $pattern =~ s/(\W)/\\$1/g;

       (If "use locale" is set, then this depends on the current locale.)
       Today it is more common to use the quotemeta() function or the "\Q"
       metaquoting escape sequence to disable all metacharacters' special
       meanings like this:

	   /$unquoted\Q$quoted\E$unquoted/

       Beware that if you put literal backslashes (those not inside interpo-
       lated variables) between "\Q" and "\E", double-quotish backslash inter-
       polation may lead to confusing results.	If you need to use literal
       backslashes within "\Q...\E", consult "Gory details of parsing quoted
       constructs" in perlop.

       Extended Patterns

       Perl also defines a consistent extension syntax for features not found
       in standard tools like awk and lex.  The syntax is a pair of parenthe-
       ses with a question mark as the first thing within the parentheses.
       The character after the question mark indicates the extension.

       The stability of these extensions varies widely.  Some have been part
       of the core language for many years.  Others are experimental and may
       change without warning or be completely removed.  Check the documenta-
       tion on an individual feature to verify its current status.

       A question mark was chosen for this and for the minimal-matching con-
       struct because 1) question marks are rare in older regular expressions,
       and 2) whenever you see one, you should stop and "question" exactly
       what is going on.  That's psychology...

       "(?#text)"
		 A comment.  The text is ignored.  If the "/x" modifier
		 enables whitespace formatting, a simple "#" will suffice.
		 Note that Perl closes the comment as soon as it sees a ")",
		 so there is no way to put a literal ")" in the comment.

       "(?imsx-imsx)"
		 One or more embedded pattern-match modifiers, to be turned on
		 (or turned off, if preceded by "-") for the remainder of the
		 pattern or the remainder of the enclosing pattern group (if
		 any). This is particularly useful for dynamic patterns, such
		 as those read in from a configuration file, read in as an
		 argument, are specified in a table somewhere, etc.  Consider
		 the case that some of which want to be case sensitive and
		 some do not.  The case insensitive ones need to include
		 merely "(?i)" at the front of the pattern.  For example:

		     $pattern = "foobar";
		     if ( /$pattern/i ) { }

		     # more flexible:

		     $pattern = "(?i)foobar";
		     if ( /$pattern/ ) { }

		 These modifiers are restored at the end of the enclosing
		 group. For example,

		     ( (?i) blah ) \s+ \1

		 will match a repeated (including the case!) word "blah" in
		 any case, assuming "x" modifier, and no "i" modifier outside
		 this group.

       "(?:pattern)"
       "(?imsx-imsx:pattern)"
		 This is for clustering, not capturing; it groups subexpres-
		 sions like "()", but doesn't make backreferences as "()"
		 does.	So

		     @fields = split(/\b(?:a|b|c)\b/)

		 is like

		     @fields = split(/\b(a|b|c)\b/)

		 but doesn't spit out extra fields.  It's also cheaper not to
		 capture characters if you don't need to.

		 Any letters between "?" and ":" act as flags modifiers as
		 with "(?imsx-imsx)".  For example,

		     /(?s-i:more.*than).*million/i

		 is equivalent to the more verbose

		     /(?:(?s-i)more.*than).*million/i

       "(?=pattern)"
		 A zero-width positive look-ahead assertion.  For example,
		 "/\w+(?=\t)/" matches a word followed by a tab, without
		 including the tab in $&.

       "(?!pattern)"
		 A zero-width negative look-ahead assertion.  For example
		 "/foo(?!bar)/" matches any occurrence of "foo" that isn't
		 followed by "bar".  Note however that look-ahead and look-
		 behind are NOT the same thing.  You cannot use this for
		 look-behind.

		 If you are looking for a "bar" that isn't preceded by a
		 "foo", "/(?!foo)bar/" will not do what you want.  That's
		 because the "(?!foo)" is just saying that the next thing can-
		 not be "foo"--and it's not, it's a "bar", so "foobar" will
		 match.  You would have to do something like "/(?!foo)...bar/"
		 for that.   We say "like" because there's the case of your
		 "bar" not having three characters before it.  You could cover
		 that this way: "/(?:(?!foo)...|^.{0,2})bar/".	Sometimes it's
		 still easier just to say:

		     if (/bar/ && $` !~ /foo$/)

		 For look-behind see below.

       "(?<=pattern)"
		 A zero-width positive look-behind assertion.  For example,
		 "/(?<=\t)\w+/" matches a word that follows a tab, without
		 including the tab in $&.  Works only for fixed-width
		 look-behind.

       "(?WARNING: This extended regular expression feature is consid-
		 ered highly experimental, and may be changed or deleted with-
		 out notice.

		 This zero-width assertion evaluates any embedded Perl code.
		 It always succeeds, and its "code" is not interpolated.  Cur-
		 rently, the rules to determine where the "code" ends are
		 somewhat convoluted.

		 This feature can be used together with the special variable
		 $^N to capture the results of submatches in variables without
		 having to keep track of the number of nested parentheses. For
		 example:

		   $_ = "The brown fox jumps over the lazy dog";
		   /the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
		   print "color = $color, animal = $animal\n";

		 Inside the "(?{...})" block, $_ refers to the string the reg-
		 ular expression is matching against. You can also use "pos()"
		 to know what is the current position of matching within this
		 string.

		 The "code" is properly scoped in the following sense: If the
		 assertion is backtracked (compare "Backtracking"), all
		 changes introduced after "local"ization are undone, so that

		   $_ = 'a' x 8;
		   m<
		      (?{ $cnt = 0 })			 # Initialize $cnt.
		      (
			a
			(?{
			    local $cnt = $cnt + 1;	 # Update $cnt, backtracking-safe.
			})
		      )*
		      aaaa
		      (?{ $res = $cnt })		 # On success copy to non-localized
							 # location.
		    >x;

		 will set "$res = 4".  Note that after the match, $cnt returns
		 to the globally introduced value, because the scopes that
		 restrict "local" operators are unwound.

		 This assertion may be used as a "(?(condition)yes-pat-
		 tern|no-pattern)" switch.  If not used in this way, the
		 result of evaluation of "code" is put into the special vari-
		 able $^R.  This happens immediately, so $^R can be used from
		 other "(?{ code })" assertions inside the same regular
		 expression.

		 The assignment to $^R above is properly localized, so the old
		 value of $^R is restored if the assertion is backtracked;
		 compare "Backtracking".

		 For reasons of security, this construct is forbidden if the
		 regular expression involves run-time interpolation of vari-
		 ables, unless the perilous "use re 'eval'" pragma has been
		 used (see re), or the variables contain results of "qr//"
		 operator (see "qr/STRING/imosx" in perlop).

		 This restriction is because of the wide-spread and remarkably
		 convenient custom of using run-time determined strings as
		 patterns.  For example:

		     $re = <>;
		     chomp $re;
		     $string =~ /$re/;

		 Before Perl knew how to execute interpolated code within a
		 pattern, this operation was completely safe from a security
		 point of view, although it could raise an exception from an
		 illegal pattern.  If you turn on the "use re 'eval'", though,
		 it is no longer secure, so you should only do so if you are
		 also using taint checking.  Better yet, use the carefully
		 constrained evaluation within a Safe compartment.  See
		 perlsec for details about both these mechanisms.

       "(??{ code })"
		 WARNING: This extended regular expression feature is consid-
		 ered highly experimental, and may be changed or deleted with-
		 out notice.  A simplified version of the syntax may be intro-
		 duced for commonly used idioms.

		 This is a "postponed" regular subexpression.  The "code" is
		 evaluated at run time, at the moment this subexpression may
		 match.  The result of evaluation is considered as a regular
		 expression and matched as if it were inserted instead of this
		 construct.

		 The "code" is not interpolated.  As before, the rules to
		 determine where the "code" ends are currently somewhat convo-
		 luted.

		 The following pattern matches a parenthesized group:

		   $re = qr{
			      \(
			      (?:
				 (?> [^()]+ )	 # Non-parens without backtracking
			       |
				 (??{ $re })	 # Group with matching parens
			      )*
			      \)
			   }x;

       "(?>pattern)"
		 WARNING: This extended regular expression feature is consid-
		 ered highly experimental, and may be changed or deleted with-
		 out notice.

		 An "independent" subexpression, one which matches the sub-
		 string that a standalone "pattern" would match if anchored at
		 the given position, and it matches nothing other than this
		 substring.  This construct is useful for optimizations of
		 what would otherwise be "eternal" matches, because it will
		 not backtrack (see "Backtracking").  It may also be useful in
		 places where the "grab all you can, and do not give anything
		 back" semantic is desirable.

		 For example: "^(?>a*)ab" will never match, since "(?>a*)"
		 (anchored at the beginning of string, as above) will match
		 all characters "a" at the beginning of string, leaving no "a"
		 for "ab" to match.  In contrast, "a*ab" will match the same
		 as "a+b", since the match of the subgroup "a*" is influenced
		 by the following group "ab" (see "Backtracking").  In partic-
		 ular, "a*" inside "a*ab" will match fewer characters than a
		 standalone "a*", since this makes the tail match.

		 An effect similar to "(?>pattern)" may be achieved by writing
		 "(?=(pattern))\1".  This matches the same substring as a
		 standalone "a+", and the following "\1" eats the matched
		 string; it therefore makes a zero-length assertion into an
		 analogue of "(?>...)".  (The difference between these two
		 constructs is that the second one uses a capturing group,
		 thus shifting ordinals of backreferences in the rest of a
		 regular expression.)

		 Consider this pattern:

		     m{ \(
			   (
			     [^()]+		 # x+
			   |
			     \( [^()]* \)
			   )+
			\)
		      }x

		 That will efficiently match a nonempty group with matching
		 parentheses two levels deep or less.  However, if there is no
		 such group, it will take virtually forever on a long string.
		 That's because there are so many different ways to split a
		 long string into several substrings.  This is what "(.+)+" is
		 doing, and "(.+)+" is similar to a subpattern of the above
		 pattern.  Consider how the pattern above detects no-match on
		 "((()aaaaaaaaaaaaaaaaaa" in several seconds, but that each
		 extra letter doubles this time.  This exponential performance
		 will make it appear that your program has hung.  However, a
		 tiny change to this pattern

		     m{ \(
			   (
			     (?> [^()]+ )	 # change x+ above to (?> x+ )
			   |
			     \( [^()]* \)
			   )+
			\)
		      }x

		 which uses "(?>...)" matches exactly when the one above does
		 (verifying this yourself would be a productive exercise), but
		 finishes in a fourth the time when used on a similar string
		 with 1000000 "a"s.  Be aware, however, that this pattern cur-
		 rently triggers a warning message under the "use warnings"
		 pragma or -w switch saying it "matches null string many times
		 in regex".

		 On simple groups, such as the pattern "(?> [^()]+ )", a com-
		 parable effect may be achieved by negative look-ahead, as in
		 "[^()]+ (?! [^()] )".	This was only 4 times slower on a
		 string with 1000000 "a"s.

		 The "grab all you can, and do not give anything back" seman-
		 tic is desirable in many situations where on the first sight
		 a simple "()*" looks like the correct solution.  Suppose we
		 parse text with comments being delimited by "#" followed by
		 some optional (horizontal) whitespace.  Contrary to its
		 appearance, "#[ \t]*" is not the correct subexpression to
		 match the comment delimiter, because it may "give up" some
		 whitespace if the remainder of the pattern can be made to
		 match that way.  The correct answer is either one of these:

		     (?>#[ \t]*)
		     #[ \t]*(?![ \t])

		 For example, to grab non-empty comments into $1, one should
		 use either one of these:

		     / (?> \# [ \t]* ) (	.+ ) /x;
		     /	   \# [ \t]*   ( [^ \t] .* ) /x;

		 Which one you pick depends on which of these expressions bet-
		 ter reflects the above specification of comments.

       "(?(condition)yes-pattern|no-pattern)"
       "(?(condition)yes-pattern)"
		 WARNING: This extended regular expression feature is consid-
		 ered highly experimental, and may be changed or deleted with-
		 out notice.

		 Conditional expression.  "(condition)" should be either an
		 integer in parentheses (which is valid if the corresponding
		 pair of parentheses matched), or look-ahead/look-behind/eval-
		 uate zero-width assertion.

		 For example:

		     m{ ( \( )?
			[^()]+
			(?(1) \) )
		      }x

		 matches a chunk of non-parentheses, possibly included in
		 parentheses themselves.

       Backtracking

       NOTE: This section presents an abstract approximation of regular
       expression behavior.  For a more rigorous (and complicated) view of the
       rules involved in selecting a match among possible alternatives, see
       "Combining pieces together".

       A fundamental feature of regular expression matching involves the
       notion called backtracking, which is currently used (when needed) by
       all regular expression quantifiers, namely "*", "*?", "+", "+?",
       "{n,m}", and "{n,m}?".  Backtracking is often optimized internally, but
       the general principle outlined here is valid.

       For a regular expression to match, the entire regular expression must
       match, not just part of it.  So if the beginning of a pattern contain-
       ing a quantifier succeeds in a way that causes later parts in the pat-
       tern to fail, the matching engine backs up and recalculates the begin-
       ning part--that's why it's called backtracking.

       Here is an example of backtracking:  Let's say you want to find the
       word following "foo" in the string "Food is on the foo table.":

	   $_ = "Food is on the foo table.";
	   if ( /\b(foo)\s+(\w+)/i ) {
	       print "$2 follows $1.\n";
	   }

       When the match runs, the first part of the regular expression
       ("\b(foo)") finds a possible match right at the beginning of the
       string, and loads up $1 with "Foo".  However, as soon as the matching
       engine sees that there's no whitespace following the "Foo" that it had
       saved in $1, it realizes its mistake and starts over again one charac-
       ter after where it had the tentative match.  This time it goes all the
       way until the next occurrence of "foo". The complete regular expression
       matches this time, and you get the expected output of "table follows
       foo."

       Sometimes minimal matching can help a lot.  Imagine you'd like to match
       everything between "foo" and "bar".  Initially, you write something
       like this:

	   $_ =  "The food is under the bar in the barn.";
	   if ( /foo(.*)bar/ ) {
	       print "got <$1>\n";
	   }

       Which perhaps unexpectedly yields:

	 got 

       That's because ".*" was greedy, so you get everything between the first
       "foo" and the last "bar".  Here it's more effective to use minimal
       matching to make sure you get the text between a "foo" and the first
       "bar" thereafter.

	   if ( /foo(.*?)bar/ ) { print "got <$1>\n" }
	 got 

       Here's another example: let's say you'd like to match a number at the
       end of a string, and you also want to keep the preceding part of the
       match.  So you write this:

	   $_ = "I have 2 numbers: 53147";
	   if ( /(.*)(\d*)/ ) { 			       # Wrong!
	       print "Beginning is <$1>, number is <$2>.\n";
	   }

       That won't work at all, because ".*" was greedy and gobbled up the
       whole string. As "\d*" can match on an empty string the complete regu-
       lar expression matched successfully.

	   Beginning is , number is <>.

       Here are some variants, most of which don't work:

	   $_ = "I have 2 numbers: 53147";
	   @pats = qw{
	       (.*)(\d*)
	       (.*)(\d+)
	       (.*?)(\d*)
	       (.*?)(\d+)
	       (.*)(\d+)$
	       (.*?)(\d+)$
	       (.*)\b(\d+)$
	       (.*\D)(\d+)$
	   };

	   for $pat (@pats) {
	       printf "%-12s ", $pat;
	       if ( /$pat/ ) {
		   print "<$1> <$2>\n";
	       } else {
		   print "FAIL\n";
	       }
	   }

       That will print out:

	   (.*)(\d*)	 <>
	   (.*)(\d+)	 <7>
	   (.*?)(\d*)	<> <>
	   (.*?)(\d+)	 <2>
	   (.*)(\d+)$	 <7>
	   (.*?)(\d+)$	 <53147>
	   (.*)\b(\d+)$  <53147>
	   (.*\D)(\d+)$  <53147>

       As you see, this can be a bit tricky.  It's important to realize that a
       regular expression is merely a set of assertions that gives a defini-
       tion of success.  There may be 0, 1, or several different ways that the
       definition might succeed against a particular string.  And if there are
       multiple ways it might succeed, you need to understand backtracking to
       know which variety of success you will achieve.

       When using look-ahead assertions and negations, this can all get even
       trickier.  Imagine you'd like to find a sequence of non-digits not fol-
       lowed by "123".	You might try to write that as

	   $_ = "ABC123";
	   if ( /^\D*(?!123)/ ) {	       # Wrong!
	       print "Yup, no 123 in $_\n";
	   }

       But that isn't going to match; at least, not the way you're hoping.  It
       claims that there is no 123 in the string.  Here's a clearer picture of
       why that pattern matches, contrary to popular expectations:

	   $x = 'ABC123';
	   $y = 'ABC445';

	   print "1: got $1\n" if $x =~ /^(ABC)(?!123)/;
	   print "2: got $1\n" if $y =~ /^(ABC)(?!123)/;

	   print "3: got $1\n" if $x =~ /^(\D*)(?!123)/;
	   print "4: got $1\n" if $y =~ /^(\D*)(?!123)/;

       This prints

	   2: got ABC
	   3: got AB
	   4: got ABC

       You might have expected test 3 to fail because it seems to a more gen-
       eral purpose version of test 1.	The important difference between them
       is that test 3 contains a quantifier ("\D*") and so can use backtrack-
       ing, whereas test 1 will not.  What's happening is that you've asked
       "Is it true that at the start of $x, following 0 or more non-digits,
       you have something that's not 123?"  If the pattern matcher had let
       "\D*" expand to "ABC", this would have caused the whole pattern to
       fail.

       The search engine will initially match "\D*" with "ABC".  Then it will
       try to match "(?!123" with "123", which fails.  But because a quanti-
       fier ("\D*") has been used in the regular expression, the search engine
       can backtrack and retry the match differently in the hope of matching
       the complete regular expression.

       The pattern really, really wants to succeed, so it uses the standard
       pattern back-off-and-retry and lets "\D*" expand to just "AB" this
       time.  Now there's indeed something following "AB" that is not "123".
       It's "C123", which suffices.

       We can deal with this by using both an assertion and a negation.  We'll
       say that the first part in $1 must be followed both by a digit and by
       something that's not "123".  Remember that the look-aheads are zero-
       width expressions--they only look, but don't consume any of the string
       in their match.	So rewriting this way produces what you'd expect; that
       is, case 5 will fail, but case 6 succeeds:

	   print "5: got $1\n" if $x =~ /^(\D*)(?=\d)(?!123)/;
	   print "6: got $1\n" if $y =~ /^(\D*)(?=\d)(?!123)/;

	   6: got ABC

       In other words, the two zero-width assertions next to each other work
       as though they're ANDed together, just as you'd use any built-in asser-
       tions:  "/^$/" matches only if you're at the beginning of the line AND
       the end of the line simultaneously.  The deeper underlying truth is
       that juxtaposition in regular expressions always means AND, except when
       you write an explicit OR using the vertical bar.  "/ab/" means match
       "a" AND (then) match "b", although the attempted matches are made at
       different positions because "a" is not a zero-width assertion, but a
       one-width assertion.

       WARNING: particularly complicated regular expressions can take exponen-
       tial time to solve because of the immense number of possible ways they
       can use backtracking to try match.  For example, without internal opti-
       mizations done by the regular expression engine, this will take a
       painfully long time to run:

	   'aaaaaaaaaaaa' =~ /((a{0,5}){0,5})*[c]/

       And if you used "*"'s in the internal groups instead of limiting them
       to 0 through 5 matches, then it would take forever--or until you ran
       out of stack space.  Moreover, these internal optimizations are not
       always applicable.  For example, if you put "{0,5}" instead of "*" on
       the external group, no current optimization is applicable, and the
       match takes a long time to finish.

       A powerful tool for optimizing such beasts is what is known as an
       "independent group", which does not backtrack (see ""(?>pattern)"").
       Note also that zero-length look-ahead/look-behind assertions will not
       backtrack to make the tail match, since they are in "logical" context:
       only whether they match is considered relevant.	For an example where
       side-effects of look-ahead might have influenced the following match,
       see ""(?>pattern)"".

       Version 8 Regular Expressions

       In case you're not familiar with the "regular" Version 8 regex rou-
       tines, here are the pattern-matching rules not described above.

       Any single character matches itself, unless it is a metacharacter with
       a special meaning described here or above.  You can cause characters
       that normally function as metacharacters to be interpreted literally by
       prefixing them with a "\" (e.g., "\." matches a ".", not any character;
       "\\" matches a "\").  A series of characters matches that series of
       characters in the target string, so the pattern "blurfl" would match
       "blurfl" in the target string.

       You can specify a character class, by enclosing a list of characters in
       "[]", which will match any one character from the list.	If the first
       character after the "[" is "^", the class matches any character not in
       the list.  Within a list, the "-" character specifies a range, so that
       "a-z" represents all characters between "a" and "z", inclusive.	If you
       want either "-" or "]" itself to be a member of a class, put it at the
       start of the list (possibly after a "^"), or escape it with a back-
       slash.  "-" is also taken literally when it is at the end of the list,
       just before the closing "]".  (The following all specify the same class
       of three characters: "[-az]", "[az-]", and "[a\-z]".  All are different
       from "[a-z]", which specifies a class containing twenty-six characters,
       even on EBCDIC based coded character sets.)  Also, if you try to use
       the character classes "\w", "\W", "\s", "\S", "\d", or "\D" as end-
       points of a range, that's not a range, the "-" is understood literally.

       Note also that the whole range idea is rather unportable between char-
       acter sets--and even within character sets they may cause results you
       probably didn't expect.	A sound principle is to use only ranges that
       begin from and end at either alphabets of equal case ([a-e], [A-E]), or
       digits ([0-9]).	Anything else is unsafe.  If in doubt, spell out the
       character sets in full.

       Characters may be specified using a metacharacter syntax much like that
       used in C: "\n" matches a newline, "\t" a tab, "\r" a carriage return,
       "\f" a form feed, etc.  More generally, \nnn, where nnn is a string of
       octal digits, matches the character whose coded character set value is
       nnn.  Similarly, \xnn, where nn are hexadecimal digits, matches the
       character whose numeric value is nn. The expression \cx matches the
       character control-x.  Finally, the "." metacharacter matches any char-
       acter except "\n" (unless you use "/s").

       You can specify a series of alternatives for a pattern using "|" to
       separate them, so that "fee|fie|foe" will match any of "fee", "fie", or
       "foe" in the target string (as would "f(e|i|o)e").  The first alterna-
       tive includes everything from the last pattern delimiter ("(", "[", or
       the beginning of the pattern) up to the first "|", and the last alter-
       native contains everything from the last "|" to the next pattern delim-
       iter.  That's why it's common practice to include alternatives in
       parentheses: to minimize confusion about where they start and end.

       Alternatives are tried from left to right, so the first alternative
       found for which the entire expression matches, is the one that is cho-
       sen. This means that alternatives are not necessarily greedy. For exam-
       ple: when matching "foo|foot" against "barefoot", only the "foo" part
       will match, as that is the first alternative tried, and it successfully
       matches the target string. (This might not seem important, but it is
       important when you are capturing matched text using parentheses.)

       Also remember that "|" is interpreted as a literal within square brack-
       ets, so if you write "[fee|fie|foe]" you're really only matching
       "[feio|]".

       Within a pattern, you may designate subpatterns for later reference by
       enclosing them in parentheses, and you may refer back to the nth sub-
       pattern later in the pattern using the metacharacter \n.  Subpatterns
       are numbered based on the left to right order of their opening paren-
       thesis.	A backreference matches whatever actually matched the subpat-
       tern in the string being examined, not the rules for that subpattern.
       Therefore, "(0|0x)\d*\s\1\d*" will match "0x1234 0x4321", but not
       "0x1234 01234", because subpattern 1 matched "0x", even though the rule
       "0|0x" could potentially match the leading 0 in the second number.

       Warning on \1 vs $1

       Some people get too used to writing things like:

	   $pattern =~ s/(\W)/\\\1/g;

       This is grandfathered for the RHS of a substitute to avoid shocking the
       sed addicts, but it's a dirty habit to get into.  That's because in
       PerlThink, the righthand side of an "s///" is a double-quoted string.
       "\1" in the usual double-quoted string means a control-A.  The custom-
       ary Unix meaning of "\1" is kludged in for "s///".  However, if you get
       into the habit of doing that, you get yourself into trouble if you then
       add an "/e" modifier.

	   s/(\d+)/ \1 + 1 /eg;        # causes warning under -w

       Or if you try to do

	   s/(\d+)/\1000/;

       You can't disambiguate that by saying "\{1}000", whereas you can fix it
       with "${1}000".	The operation of interpolation should not be confused
       with the operation of matching a backreference.	Certainly they mean
       two different things on the left side of the "s///".

       Repeated patterns matching zero-length substring

       WARNING: Difficult material (and prose) ahead.  This section needs a
       rewrite.

       Regular expressions provide a terse and powerful programming language.
       As with most other power tools, power comes together with the ability
       to wreak havoc.

       A common abuse of this power stems from the ability to make infinite
       loops using regular expressions, with something as innocuous as:

	   'foo' =~ m{ ( o? )* }x;

       The "o?" can match at the beginning of 'foo', and since the position in
       the string is not moved by the match, "o?" would match again and again
       because of the "*" modifier.  Another common way to create a similar
       cycle is with the looping modifier "//g":

	   @matches = ( 'foo' =~ m{ o? }xg );

       or

	   print "match: <$&>\n" while 'foo' =~ m{ o? }xg;

       or the loop implied by split().

       However, long experience has shown that many programming tasks may be
       significantly simplified by using repeated subexpressions that may
       match zero-length substrings.  Here's a simple example being:

	   @chars = split //, $string;		 # // is not magic in split
	   ($whitewashed = $string) =~ s/()/ /g; # parens avoid magic s// /

       Thus Perl allows such constructs, by forcefully breaking the infinite
       loop.  The rules for this are different for lower-level loops given by
       the greedy modifiers "*+{}", and for higher-level ones like the "/g"
       modifier or split() operator.

       The lower-level loops are interrupted (that is, the loop is broken)
       when Perl detects that a repeated expression matched a zero-length sub-
       string.	 Thus

	  m{ (?: NON_ZERO_LENGTH | ZERO_LENGTH )* }x;

       is made equivalent to

	  m{   (?: NON_ZERO_LENGTH )*
	     |
	       (?: ZERO_LENGTH )?
	   }x;

       The higher level-loops preserve an additional state between iterations:
       whether the last match was zero-length.	To break the loop, the follow-
       ing match after a zero-length match is prohibited to have a length of
       zero.  This prohibition interacts with backtracking (see "Backtrack-
       ing"), and so the second best match is chosen if the best match is of
       zero length.

       For example:

	   $_ = 'bar';
	   s/\w??/<$&>/g;

       results in "<><><><>".	At each position of the string the
       best match given by non-greedy "??" is the zero-length match, and the
       second best match is what is matched by "\w".  Thus zero-length matches
       alternate with one-character-long matches.

       Similarly, for repeated "m/()/g" the second-best match is the match at
       the position one notch further in the string.

       The additional state of being matched with zero-length is associated
       with the matched string, and is reset by each assignment to pos().
       Zero-length matches at the end of the previous match are ignored during
       "split".

       Combining pieces together

       Each of the elementary pieces of regular expressions which were
       described before (such as "ab" or "\Z") could match at most one sub-
       string at the given position of the input string.  However, in a typi-
       cal regular expression these elementary pieces are combined into more
       complicated patterns using combining operators "ST", "S|T", "S*" etc
       (in these examples "S" and "T" are regular subexpressions).

       Such combinations can include alternatives, leading to a problem of
       choice: if we match a regular expression "a|ab" against "abc", will it
       match substring "a" or "ab"?  One way to describe which substring is
       actually matched is the concept of backtracking (see "Backtracking").
       However, this description is too low-level and makes you think in terms
       of a particular implementation.

       Another description starts with notions of "better"/"worse".  All the
       substrings which may be matched by the given regular expression can be
       sorted from the "best" match to the "worst" match, and it is the "best"
       match which is chosen.  This substitutes the question of "what is cho-
       sen?"  by the question of "which matches are better, and which are
       worse?".

       Again, for elementary pieces there is no such question, since at most
       one match at a given position is possible.  This section describes the
       notion of better/worse for combining operators.	In the description
       below "S" and "T" are regular subexpressions.

       "ST"
	   Consider two possible matches, "AB" and "A'B'", "A" and "A'" are
	   substrings which can be matched by "S", "B" and "B'" are substrings
	   which can be matched by "T".

	   If "A" is better match for "S" than "A'", "AB" is a better match
	   than "A'B'".

	   If "A" and "A'" coincide: "AB" is a better match than "AB'" if "B"
	   is better match for "T" than "B'".

       "S|T"
	   When "S" can match, it is a better match than when only "T" can
	   match.

	   Ordering of two matches for "S" is the same as for "S".  Similar
	   for two matches for "T".

       "S{REPEAT_COUNT}"
	   Matches as "SSS...S" (repeated as many times as necessary).

       "S{min,max}"
	   Matches as "S{max}|S{max-1}|...|S{min+1}|S{min}".

       "S{min,max}?"
	   Matches as "S{min}|S{min+1}|...|S{max-1}|S{max}".

       "S?", "S*", "S+"
	   Same as "S{0,1}", "S{0,BIG_NUMBER}", "S{1,BIG_NUMBER}" respec-
	   tively.

       "S??", "S*?", "S+?"
	   Same as "S{0,1}?", "S{0,BIG_NUMBER}?", "S{1,BIG_NUMBER}?" respec-
	   tively.

       "(?>S)"
	   Matches the best match for "S" and only that.

       "(?=S)", "(?<=S)"
	   Only the best match for "S" is considered.  (This is important only
	   if "S" has capturing parentheses, and backreferences are used some-
	   where else in the whole regular expression.)

       "(?!S)", "(?at a given position.
       One more rule is needed to understand how a match is determined for the
       whole regular expression: a match at an earlier position is always bet-
       ter than a match at a later position.

       Creating custom RE engines

       Overloaded constants (see overload) provide a simple way to extend the
       functionality of the RE engine.

       Suppose that we want to enable a new RE escape-sequence "\Y|" which
       matches at boundary between whitespace characters and non-whitespace
       characters.  Note that "(?=\S)(? \&convert;
	   }

	   sub invalid { die "/$_[0]/: invalid escape '\\$_[1]'"}

	   # We must also take care of not escaping the legitimate \\Y|
	   # sequence, hence the presence of '\\' in the conversion rules.
	   my %rules = ( '\\' => '\\\\',
			 'Y|' => qr/(?=\S)(?;
	   chomp $re;
	   $re = customre::convert $re;
	   /\Y|$re\Y|/;

BUGS
       This document varies from difficult to understand to completely and
       utterly opaque.	The wandering prose riddled with jargon is hard to
       fathom in several places.

       This document needs a rewrite that separates the tutorial content from
       the reference content.

SEE ALSO
       perlrequick.

       perlretut.

       "Regexp Quote-Like Operators" in perlop.

       "Gory details of parsing quoted constructs" in perlop.

       perlfaq6.

       "pos" in perlfunc.

       perllocale.

       perlebcdic.

       Mastering Regular Expressions by Jeffrey Friedl, published by O'Reilly
       and Associates.



perl v5.8.8			  2006-01-07			     PERLRE(1)
=19421
+739
(87)