\w
¹ïÀ³¨ìªþ«µ°O¸¹ (accented)ªº¦r¤¸?
/[a-zA-Z]/
¹ïÀ³?
/o
¨ì©³¬O·F»ò¥Îªº?
\b
§@¦r¬É·j´M®É·|¥¢±Ñ©O?
\G
¯àµ¹§Ú¤°»ò¦n³B?
#§â¨C¦æÅܦ¨¡u²Ä¤@Ó¦r¡B«_¸¹¡A©M³Ñ¾lªº¦r¤¸¼Æ¡v³o¼Ëªº®æ¦¡¡C s/^(\w+)(.*)/ lc($1) . ":" . length($2) /ge;
/x
×¹¢¤l·|nª½Ä¶¾¹©¿²¤¥¿³Wªí¥Ü¦¡¤ºªº¥ô·NªÅ¥Õ (¦b¯S©w¦r¤¸Ãþ§O [character
class]¤¤¨Ò¥~)¡A¦P®É¤]Åý§A¦b¦¡¤l¤¤¨Ï¥Î¥±`ªºµù¸Ñ¤èªk¡C§AÀ³¸Ó¯à·Q¹³±o¨ì¡A
¥[¤W¤@¨ÇªÅ¥Õ»Pµù¸ÑÀ°§U·|¦³¦h¤j¡C
/x
Åý§A§â¤U±³o¦æ¡G
s{<(?:[^>'"]*|".*?"|'.*?')+>}{}gs;
Åܦ¨¡G
s{ < #½bÀY¬A©·°Ï°_©l (?: #¹º¤À¡u¤Å°l·¹«e¬q¡v(non-backreferencing)ªº¬A©· [^>'"] * #¦³¹sÓ¥H¤W¡B¤£¬O >¡B '¡A©Î "ªº¦r¤¸ | #©ÎªÌ¬O ".*?" #¤@¬qÂù¤Þ¸¹°é°_¨Óªº°Ï°ì (§[¶Þ¦¡¹ïÀ³) | #©ÎªÌ¬O '.*?' #¤@¬q³æ¤Þ¸¹°é°_¨Óªº°Ï°ì (§[¶Þ¦¡¹ïÀ³) ) + #¥H¤W°Ï°ì¥X²{¤@¦¸©Î¦h¦¸ > #½bÀY¬A©·°Ïµ²§ô }{}gsx; #¥ÎªÅ¦r¦ê¨Ó´À´«¡F¤]´N¬O±þ±¼
ÁöµM¥¦¬Ý¨ÓÁÙ¬O¤£°÷²©ú©öÀ´¡A¦ý¦Ü¤Ö¤j¤j¦³§U©ó¸ÑÄÀ³oÓ¼Ò¦¡ (pattern)ªº·N¸q¡C
/
¦r¤¸¨Ó°Ï¹j¡A¦ý¹ê»Ú¤W¥Î´X¥G¥ô¦ó¦r¤¸¨Ó§@³£¦æ¡Cperlre¤å¥ó¤¤¦³»¡©ú¡C¨Ò¦p¡A¤W±ªº s///
«K¬O¥Î¤j¬A¸¹¨Ó·í°Ï¹j¦r¤¸ªº¡C¿ï¾Ü¥t¤@ӰϹj¦r¤¸¥i¥H§K°£¦b¼Ò¦¡¤¤±oÁ׶}
(quote)°Ï¹j¦r¤¸ªº§xÂZ¡C¨Ò¦p¡G
s/\/usr\/local/\/usr\/share/g; #¿ï¿ù°Ï¹j¦r¤¸ªº«áªG¡iĶµù¡G #±`³QÀ¸ºÙ¬°¡u·f¤úÅÒ¡v¯gÔ¸s ;-)¡j
s#/usr/local#/usr/share#g; #³o¼Ë¤£¬O¦n¦h¤F?!
¦³«Ü¦h¤èªk±N¦h¦æªº¸ê®Æµ²¦X¦¨¤@Ó¦r¦ê¡C¦pªG§A§Æ±æ¦bŪ¤J¿é¤J¸ê®Æ®É¦Û°Ê±o¨ì
³o¶µ¥\¯à¡A§A±o«·s³]©w $/ÅÜ¼Æ (Y¬°¬q¸¨¡A³]¦¨ ''¡FYn±N¾ãÓÀÉ®×Ū¶i¤@¦r
¦ê¡A³]¦¨ undef
)¡A¥H®e³\§A¤@¦¸¯àŪ¤J¤@¦æ¥H¤Wªº¿é¤J¡C
½Ð°Ñ¦Ò prelre¡A¨ä¤¤¦³¿ï¾Ü /s
©Î /m
(©Î¤GªÌ³£¥Î)ªº»¡©ú¡G /s
Åý¸U¥Î¦r¤¸ (``.'')¯à¹ïÀ³¨ì´«¦æ¦r¤¸¡iĶµù¡G³q±`´«¦æ¦r¤¸¤£¦b ``.''
ªº¹ïÀ³½d³ò¤º¡j¡A
/m
«hÅý ``^''©M ``$''¨âӲŸ¹¯à°÷¹ïÀ³¨ì¥ô¦ó´«¦æ¦r¤¸ªº«e«á¡A¦Ó¤£¥u¬O¹³¥±`
¨º¼Ë¥u¯à¹ïÀ³¨ì¦r¦êÀY§À¡C§A©Ò»Ýn½T©wªº¬O§Aªº½T¦³Ó¦h¦æªº¦r¦ê¡C
¨Ò¦p»¡¡A¥H¤U³oÓµ{¦¡·|°»´ú¥X¦P¤@¬q¸¨¸Ì«ÂЪº¦r¡A§Y¨Ï¥¦Ì¤§¶¡¦³´«¦æ²Å¸¹¬Û¹j
(¦ý¬O¤£¯à¹j¬q)¡C¦b³oÓ¨Ò¤l¸Ì¡A§Ṳ́£»Ýn¥Î¨ì /s
¡A¦]¬°§Ų́弦b¥ô¦ón¸ó¦æ¹ïÀ³ªº¥¿³Wªí¥Ü¦¡¤¤¨Ï¥Î ``.''¡C§ÚÌ¥çµL»Ý¨Ï¥Î /m
¡A¦]¬°§Ṳ́£·QÅý ``^''©Î ``$''¥h¹ïÀ³
¨ì¦r¦ê¤¤¨CÓ´«¦æ¦r¤¸«e«áªº¦ì¸m¡C¦ý«ÂI¬O¡A§Ú̱o§â $/
³]¦¨»P¤º©wȬ۲§ªºÈ¡A§_«h§Ú̹ê»Ú¤W¬OµLªkŪ¤J¤@Ó¦h¦æªº¸ê®Æªº¡C
$/ = ''; #Ū¤J¤@¾ã¬q¡A¦Ó«D¶È¬O¤@¦æ¡C while ( <> ) { while ( /\b(\w\S+)(\s+\1)+\b/gi ) { print "¦b¬q¸¨ $.§ä¨ì«½Æªº¦r $1\n"; } }
¥H¤Uªºµ{¦¡¯à§ä¥X¶}ÀY¬° ``From ''ªº¥y¤l (³\¦h¶l¥ó³B²zµ{¦¡³£·|¥Î¨ì³oÓ¥\¯à)¡G
$/ = ''; #Ū¤J¤@¾ã¬q¡A¦Ó«D¶È¬O¤@¦æ¡C while ( <> ) { while ( /^From /gm ) { # /m¨Ï±o ^¤]·|¹ïÀ³¨ì \n¤§«á print "¶}ÀY¬° Fromªº¬q¸¨ $.\n"; } }
¥H¤Uªºµ{¦¡·|§ì¥X¦b¤@Ó¬q¸¨¸Ì©Ò¦³§¨¦b START»P END¤§¶¡ªºªF¦è¡C
undef $/; #§â¾ãÓÀÉ®×Ū¶i¨Ó¡A¦Ó«D¥u¬O¤@¦æ©Î¤@¬q while ( <> ) { while ( /START(.*?)END/sm ) { # /s¨Ï±o .¯à¸ó¶V¦æ¬É print "$1\n"; } }
..
¹Bºâ¤¸ (¦b perlop¤å¥ó¤¤¦³»¡©ú):
perl -ne 'print if /START/ .. /END/' file1 file2 ...
¦pªG§Anªº¬O¾ã¬q¤å¦r¦Ó«D¦U³æ¦æ¡A§A¸Ó¨Ï¥Î¡G
perl -0777 -pe 'print "$1\n" while /START(.*?)END/gs' file1 file2 ...
¦ý¬O·í START
©M END
¤§¶¡ªºªF¦è§@±_ª¬(¤º§t)¦¡¤À¥¬ (nested occurrences)ªº®ÉÔ
¡A§A«K±o±¹ï¥»½g¤¤©Ò´£¨ìªº¹ïºÙ¦¡¤å¦r¹ïÀ³ªº°ÝÃD¡C
¨Æ¹ê¤W¡A¦pªG§A¤£¤¶·N§â¾ãÓÀÉ®×Ū¤J°O¾ÐÅ骺¸Ü¡A¤£§«¸Õ¸Õ¬Ý³oÓ¡G
undef $/; @records = split /your_pattern/, <FH>;
Net::Telnet¼Ò²Õ (CPAN¸Ì¦³)¨ã¦³¤@¶µ¥\¯à¡A¥iºÊµøµÛ¿é¤J¬y (input stream)¡Bµ¥«Ý¯S©wªº¼Ò¦¡¥X²{¡A©Î¬O¦b³W©w®É¶¡¨ì¤FÁÙ¨Sµ¥¨ì®É¡A°e¥X¹O®É (timeout)°T®§¡C
##¶}¤@Ó¦³¤T¦æªºÀÉ®× open FH, ">file"; print FH "The first line\nThe second line\nThe third line\n"; close FH;
##¨ú±o¤@Ó¥iŪ/¼gªºÀɮ׳B²z§â¤â $fh = new FileHandle "+<file";
##§â¥¦ªþµÛ¦¨¤@Ó "stream"ª«¥ó use Net::Telnet; $file = new Net::Telnet (-fhopen => $fh);
##µ¥¨ì²Ä¤G¦æ¥X²{¤F¡A´N§â²Ä¤T¦æ¦L¥X¨Ó¡C $file->waitfor('/second line\n/'); print $file->getline;
#ì§@ªÌ¬° Nathan Torkington,¸g Jeffrey Friedl½Õ¾ã # sub preserve_case($$) { my ($old, $new) = @_; my ($state) = 0; # 0 = no change; 1 = lc; 2 = uc my ($i, $oldlen, $newlen, $c) = (0, length($old), length($new)); my ($len) = $oldlen < $newlen ? $oldlen : $newlen;
for ($i = 0; $i < $len; $i++) { if ($c = substr($old, $i, 1), $c =~ /[\W\d_]/) { $state = 0; } elsif (lc $c eq $c) { substr($new, $i, 1) = lc(substr($new, $i, 1)); $state = 1; } else { substr($new, $i, 1) = uc(substr($new, $i, 1)); $state = 2; } } #§â³Ñ¤Uªº new³¡¥÷§@³B²z (·í new¤ñ oldªø®É) if ($newlen > $oldlen) { if ($state == 1) { substr($new, $oldlen) = lc(substr($new, $oldlen)); } elsif ($state == 2) { substr($new, $oldlen) = uc(substr($new, $oldlen)); } } return $new; }
$a = "this is a TEsT case"; $a =~ s/(test)/preserve_case($1, "success")/gie; print "$a\n";
³o·|¦L¥X¡G
this is a SUcCESS case
\w
¹ïÀ³¨ìªþ«µ°O¸¹ (accented)ªº¦r¤¸?
/[a-zA-Z]/
¹ïÀ³?
/[^\W\d_]/
ªí¥Ü¡A¤£½×§Aªº locale¬°¦ó¡C«D¦r¥À«h¥i¥Î
/[\W\d_]/
ªí¥Ü (°²©w§A¤£§â ``_''·í¦¨¦r¤¸)¡C
$variable
¤Î @variable
ÅܼơC¦P®É¤]n°O±o¡A¤@Ó s///
´À´«¦¡¥k°¼³¡¥÷¬O·í¦¨Âù¤Þ¸¹¬A°_¨Ó³B²zªº (¸Ô±¡½Ð°Ñ¬Ý perlop»¡©ú¤å¥ó)¡C§ó§O§Ñ°O¡A¥ô¦ó¤@Ó¥¿³Wªí¥Ü¦¡¸Ìªº¯S®í¦r¤¸³£·|¥ý³Q¸ÑĶ¡B³B²z¡A
°£«D§A¦b´À´«¼Ò¦¡«e¥[ \Q¡C¥H¤U§Y¬°¤@¨Ò¡C
$string = "to die?"; $lhs = "die?"; $rhs = "sleep no more";
$string =~ s/\Q$lhs/$rhs/; # $string²{¦b¦¨¤F "to sleep no more"
¤Ö¤F \Q¡A«h³oÓ¥¿³Wªí¥Ü¦¡¦P®É¤]·|¿ù»~¦a¹ïÀ³¨ì ``di''¡C¡iĶµù¡G¦]¬° /die?/ ³oÓ¦¡¤lªí¥Ü ``di''«áÀYªº ``e''¥i¦³¹sөΤ@Ó¡j
/o
¨ì©³¬O·F»ò¥Îªº?
/o
·|¦b²Ä¤@¦¸¥Î¨ì¨ºÓÅܼÆ
®É§â¥¦Âê©w¡C¦b¤@ÓµLÅܼƪº¥¿³Wªí¥Ü¦¡¸Ì±¡A¦¹±¡§Î¥Ã»·¬°¯u¡A¦Ó¥B¨Æ¹ê¤W¡A·í§A¾ã
Óµ{¦¡¦b³Q½sĶ¦¨¤º³¡(¦ì¤¸)½Xªº¦P®É¡A§A©Ò¥Îªº¼Ò¦¡¥çµM¡C
°£«D¦b¼Ò¦¡¸Ì¦³ÅܼÆÂàĶªº±¡ªpµo¥Í¡A§_«h¨Ï¥Î /o
¬OµLÃöµhÄoªº¡C¦b¼Ò¦¡¤¤¦³ÅܼƨåB¤S¦³ /o
×¹¢¤lªº±¡ªp¤U¡A¥¿³Wªí¥Ü¦¡¤ÞÀº«h¬J¤£·|ª¾¹D¤]¤£·|¥hºÞ³oÓ¼Ò¦¡¦b
²Ä¤@¦¸µû¦ô¤§«á¨ä¤¤ÅܼƬO§_¤S¦³©Ò§ïÅÜ¡C
/o
±`³Q¥Î¨ÓÃB¥~´£°ª°õ¦æ®Ä²v¡C·í«Âеû¦ôµLÃöºòn (¦]¬°¨Æ¥ýª¾¹D¸ÓÅܼƪº
Ȥ£·|§ïÅÜ)¡F©Î¬O¦b¦³¨Ç¨u¨£ªº±¡ªp¤U¡A¬G·N¤£Åý¥¿³Wªí¥Ü¦¡¤ÞÀº¹îı¨ìÅܼÆȤw§ïÅÜ
®É¡A«K¥i³z¹L¦¹¤@¤â¬q¡AÁקK«ùÄòµû¦ô¡A¨Ó¹F¨ì´£°ª®Ä²vªº¥Øªº¡C
¤U±¥H¤@Ó ``paragrep'' (¡u¬q¸¨grep¡v)µ{¦¡§@½d¨Ò¡G
$/ = ''; #¨Ï¥Î¬q¸¨¼Ò¦¡ $pat = shift; while (<>) { print if /$pat/o; }
perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
¥u¯à¦b¤j³¡¤À(¦ý«D¥þ³¡)ªº±¡ªp¤U¦¨¥\¡C§Aª¾¹D¡A³oµ{¦¡¹ï¬Y¨ÇºØÃþªº Cµ{¦¡Åã±o¤Ó ²®¡B³æ¯Â¤F¡A¤×¨ä¬O¨º¨Ç³QÂù¤Þ¸¹¬A°_¨Ó¡B¬Ý¦üµù¸Ñªº¦r¦ê¡C°w¹ï¥¦Ì¡A§A»Ýn¹³ ³oÓ Jeffrey Friedl©Ò¼gªº³o¼Ëªºµ{¦¡¡G
$/ = undef; $_ = <>; s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|\n+|.[^/"'\\]*)#$2#g; print;
·íµM¡A³oµ{¦¡¥i¥H¥Î /x
¥[¤WªÅ¥Õ»Pª`¸Ñ¨Ï¥¦§ó®e©öÅý¤H¬ÝÀ´¡C
\1
¤§Ãþ)³o¼Ë¤è«Kªº¥\¯à¡A¦ý¥¦Ì¤´µM¤£°÷±j¤j¡C§A¨ÌµM±o¥Î«D¥¿³Wªí¥Ü¦¡
ªº§Þ³N¥h¸ÑªR³oÃþ¤å¦r¡AÄ´¦p¹³¨âºÝ¥Î¤p¬A¸¹©Î¤j¬A¸¹¥]§t°_¨Óªº¤å¦r¡C
§A¥i¥H¦b http://www.perl.com/CPAN/authors/id/TOMC/scripts/pull_quotes.gz
§ä¨ì¤@Óºë²Ó½ÆÂøªº°Æ±`¦¡(µ¹ 7-bit ASCII±M¥Î)¡A¥¦¥i¥H§ì¥X¦¨¹ï¬Æ¦Ü©ó±_ª¬¤À¥¬
ªº³æ¤@¦r¤¸¡A¹³ `
©M '
¡A{
©M }
¡A©Î (
©M )
¡C
CPAN¤¤ªº C::Scan¼Ò²Õ¥]§t¤@Ó³o¼Ëªº°Æ±`¦¡¨Ñ¤º³¡¨Ï¥Î¡A¦ýµL»¡©ú¤å¥ó¡C
?
, *
, +
,{}
)¦Ó«D¾ãÓ¼Ò¦¡¡FPerl¸û³ßÅw§@°Ï°ì©Êªº³g°ý¥H±o
¨ì¥ß§Yªº§Ö·P¡A¦Ó¤£¬O¹ï¾ãÓ¦¡¤lªº³g°ý¡C¦p±ý¨Ï¥Î¦P¼Ëªº¶q¤Æ¤l§@«D³g°ý¦¡¹ïÀ³ªº¸Ü
¡iĶµù¡G§Y©Ò¿×ªº§[¶Þ(stingy)¦¡¹ïÀ³¡j¡A¥Î (??
, *?
, +?
, {}?
)¡C¨Ò¦p¡G
$s1 = $s2 = "I am very very cold"; $s1 =~ s/ve.*y //; #³g°ý¦¡¡Fµ²ªG¬° I am cold $s2 =~ s/ve.*?y //; #§[¶Þ¦¡¡Fµ²ªG¬° I am very cold
ª`·N¨ì¦b²Ä¤GÓ´À´«¤¤¤@¸I¨ì ``y''´N°±¤î¾ãÓ¹ïÀ³¤F¶Ü? *?
¶q¤Æ¤l¦³®Ä²v¦a§i¶D¥¿
³Wªí¥Ü¦¡¤ÞÀº¡A¤@¦ý¹ïÀ³¨ì¤@Ó¼Ò¦¡¡A´N°¨¤W§â±±¨îÅv²¾¥æ¤U¥h¡A³o¦æ¬°´N¦n¤ñ§A¤â¤W¦³
Ó¿S¤â¤s¨¡®É©Ò·|±Ä¨úªº¦æ°Ê¤@¼Ë¡C
while (<>) { foreach $word ( split ) { #¦b¦¹§@§A·Q¹ï $word§@ªº°Ê§@ } }
½Ðª`·N³o¸Ì©Ò¿×ªº¦r©M^¤å¤¤¹ï¦rªº©w¸q¤£¦P¡F¥¦Ì¥i¯à¥u¬O¤@¬q³sÄòªº¡B«DªÅ¥Õªº ¦r¤¸½}¤F¡C
Y±ý³B²zªº¬O¤@³s¦ê¯Â¦r¥Àªº¸Ü¡A¥i¥H¦Ò¼{¥Î¡G
while (<>) { foreach $word (m/(\w+)/g) { #¦b¦¹§@§A·Q¹ï $word§@ªº°Ê§@ } }
while (<>) { while ( /(\b[^\W_\d][\w'-]+\b)/g ) { # "`sheep'"·|º|¥¢±¼ $seen{$1}++; } } while ( ($word, $count) = each %seen ) { print "$count $word\n"; }
¦pªG§Anºâ¦æ¼Æ¡A«h¥Î¤£µÛ¨Ï¥Î¥¿³Wªí¥Ü¦¡¡G
while (<>) { $seen{$_}++; } while ( ($line, $count) = each %seen ) { print "$count $line"; }
¦pªG§A§Æ±æ³o¨Ç¿é¥X¸g¹L±Æ¦C¡A½Ð°Ñ¬Ý¦³Ãö Hashesªº¨º³¡¤À¡C
while (<FH>) { foreach $pat (@patterns) { if ( /$pat/ ) { # do something } } }
nÁקK¥H¤Wªº¤èªk¡An¤£§A´N¿ï¥Î CPAN ¤¤´XÓ¹êÅç©Êªº¥¿³Wªí¥Ü¦¡ÂX¥R¼Ò²Õ¨ä¤¤¤@Ó (¹ï§Aªº¥Øªº¨Ó»¡¥i¯à®Ä²vÁÙ¬O¤£°÷¦n)¡A©Î¬O¦Û¤v¼gÓ¹³¤U±³o¼ËªºªF¦è (¦Û Jeffrey Friedl®Ñ¤¤ªº¤@Ө禡©Ò±o¨ìªºÆF·P)¡G
sub _bm_build { my $condition = shift; my @regexp = @_; #³o¸Ì¤£¥i¥Î local()¡A±o¥Î my() my $expr = join $condition => map { "m/\$regexp[$_]/o" } (0..$#regexp); my $match_func = eval "sub { $expr }"; die if $@; # $@¡i¿ù»~Åܼơj¸Ì±¦³ªF¦è¡F³o¤£¸Ó¥X²{¡I return $match_func; }
sub bm_and { _bm_build('&&', @_) } sub bm_or { _bm_build('||', @_) }
$f1 = bm_and qw{ xterm (?i)window };
$f2 = bm_or qw{ \b[Ff]ree\b \bBSD\B (?i)sys(tem)?\s*[V5]\b };
#Áý§Ú /etc/termcap while ( <> ) { print "1: $_" if &$f1; print "2: $_" if &$f2; }
\b
§@¦r¬É·j´M®É·|¥¢±Ñ©O?
\b
°µ¬° \s+
ªº¦P¸qµü¡AÁÙ¦³§â¥¦·í¦¨¬É©wªÅ¥Õ¤Î«DªÅ¥Õ¦r¤¸¶¡ªºÃä¬É¡C¨âªÌ³£¤£¹ï¡C\b
¬O¤¶©ó¤@Ó \w
¦r¤¸©M \W
¦r¤¸¤§¶¡ªº³¡¤À(¥ç§Y \b
¬O¤@Ó¡u¦r¡vªºÃä½t)¡C¥¦¬O¤@Óªø«×¬° 0ªº¼Ðªºª«¡A´N¹³
^
¡B$
¡A¥H¤Î©Ò¦³¨ä¥¦ªº¼Ð¥Ü¦r¤¸ (anchors)¤@¼Ë¡A¦b¹ïÀ³®É¨Ã¤£®ø¯Ó¡B¦û±¼¥ô¦ó¦r¤¸¡Cperlre¨Ï¥Î»¡©ú¤¤¹ï¦U¥¿³Wªí¥Ü¦¡¶W¦r¤¸ (metacharacters)ªº¯S©Ê©M¨Ï¥Î³£¦³°µ¸ÑÄÀ¡C
¥H¤U¬O¿ù»~¨Ï¥Î \b
ªº¨Ò¤l¡A¨Ãªþ¤W×¥¿¡G
"two words" =~ /(\w+)\b(\w+)/; #¿ù»~¡I "two words" =~ /(\w+)\s+(\w+)/; #¥¿½T
" =matchless= text" =~ /\b=(\w+)=\b/; #¿ù»~¡I " =matchless= text" =~ /=(\w+)=/; #¥¿½T
ÁöµM¥¦Ì¤]³\¤£¯à§@¨ì§A¥H¬°¥¦Ì¯à§@ªº¨Æ¡A¦ý \b
¤Î \B
¤´µM¬Û·í¦³¥Î¡Cn¬Ý¬Ý¥¿½T¨Ï¥Î \b
ªº½d¨Ò¡A½Ð°Ñ¦Ò¡u¦p¦ó©ó¦h¦æ¤å¦r¤¤§ì¥X«½Æ¦r¡v¤@°ÝÃD¤º©Òªþ¤§½d¨Ò¡C
\Bis\B
³oÓ¼Ò¦¡¬O¨Ï¥Î \B
ªº¤@Ó¨Ò¤l¡C¥¦¥u·|¹ïÀ³¨ì¥X²{¦b¤@Ó¦r¤º³¡ªº ``is''¡A¨Ò¦p
``thistle''¡A¦ý¤£·|¹ïÀ³¨ì ``this''©Î ``island''¡C
$2
µ¥µ¥ªº¨Ï¥Î¤]¬O¥H¦P¼Ëªº¤è¦¡³B²zªº¡C©Ò¥H¨C·í§Aªº¼Ò¦¡¤¤§t¦³®·®»¥Îªº¤p¬A¸¹
(capturing parentheses)®É¡A
§A´N±o¥I¥X¦P¼Ëªº¥N»ù¡C¦ýY§A±q¤£¦b§Aªºµ{¦¡¤¤¥Î¨ì $&µ¥³o¨ÇªF¦è¡A¨º»ò
¨S¦³®·®»¥Î¤p¬A¸¹ªº¥¿³Wªí¥Ü¦¡´N¤£¥Î¥I¥XÃB¥~ªº³t«×§@¥N»ù¡C©Ò¥H¡A½ÐºÉ¥i¯àÁקK¨Ï¥Î
$&, $'¤Î $`¡A¦ýY¯uªºµLªkÁקK (¦³¨Çºtºâªkªº½T»Ýn¥¦Ì)¡A´NºÉ¶q¥Î§
§a¡A¤Ï¥¿§A¤w¸g¥I¥X¥N»ù¤F¡C
\G
¯àµ¹§Ú¤°»ò¦n³B?
\G
¦b¤@Ó¹ïÀ³¦¡©Î´À´«¦¡¤¤n©M /g
×¹¢¤l¦X°_¨Ó¥Î (YµL /g
¥¦´N·|³Q©¿²²¤)¡C¥¦¬O¥Î¨Ó¼Ð¥Ü¤W¤@Ó¦¨¥\ªº¼Ò¦¡¹ïÀ³§¹¦¨«á©Ò°±¦bªº¦ì¸m¡A¥ç§Y
pos()
ÂI¡C
¨Ò¦p»¡¡A§A¦³¤@¦æ«H¥ó¤å¦r¬O«ö¼Ð·Çªº mail¤Î Usenet°Oªk (´N¬O¥H >
¦r¤¸§@¶}©l)§@¦¨¤Þ¨¥ªº¡A¦Ó§A²{¦bn§â¨CÓ¶}ÀYªº >
³£´«¦¨ :
¡C¨º»ò§A¥i¥H¥Î¤U±ªº¤èªk¨Ó§@¡G
s/^(>+)/':' x length($1)/gem;
©ÎªÌ¨Ï¥Î \G
¡A§ó²³æ¤]§ó§Ö¡G
s/\G>/:/g;
§ó½ÆÂøªº¤èªk¥i¯àn¥Î¨ì°O¸¹½á¤©¾¹ (tokenizer)¡C¤U±¬Ý¨Ó¹³ lex»yªk¤ÀªR¾¹µ{¦¡
½Xªº¨Ò¤l¬O Jeffrey Friedl´£¨Ñªº¡C¥¦¦b 5.003
ª©¦]¬°¨äª©¥»¤¤ªº¯äÂΦӵLªk°õ¦æ¡A¦ý¦b 5.004©Î¥H¤Wªºª©¥»ªº½T¥i¦æ¡C(½Ðª`·N¨ì /c
ªº¨Ï¥Î¡A¥¦ªº¦s¦b¬O¬°¤F¨¾¤î /g
¦b¹ïÀ³¥¢±Ñ®É±N·j´M¦ì¸mÂk¹s¨ì¦r¦êªº¶}©l¡C)
while (<>) { chomp; PARSER: { m/ \G( \d+\b )/gcx && do { print "number: $1\n"; redo; }; m/ \G( \w+ )/gcx && do { print "word: $1\n"; redo; }; m/ \G( \s+ )/gcx && do { print "space: $1\n"; redo; }; m/ \G( [^\w\d]+ )/gcx && do { print "other: $1\n"; redo; }; } }
·íµM¡A¤W±³oÓ¥»¨Ó¤]¥i¥H¼g¦¨¹³
while (<>) { chomp; PARSER: { if ( /\G( \d+\b )/gcx { print "number: $1\n"; redo PARSER; } if ( /\G( \w+ )/gcx { print "word: $1\n"; redo PARSER; } if ( /\G( \s+ )/gcx { print "space: $1\n"; redo PARSER; } if ( /\G( [^\w\d]+ )/gcx { print "other: $1\n"; redo PARSER; } } }
¦ý¬O³o»ò§@´N¤£¯àÅý¨º¨Ç¥¿³Wªí¥Ü¦¡ªº¦¡¤l¤W¤U¹ï»ô¤@¥ØÁAµM¤F¡C
egrep(1)
µ{¦¡ªº DFAs (deterministic
finite
automata¡A¨M©w¦¡¦³¦Û°Ê¾÷)¯S©Ê¡A¦ý¨Æ¹ê¤W¬°¤F¨ã³Æ¡u°h¦^ì¸ô¡v(backtracking)
»P¡u°l·¹«e¬q¡v( backreferencing)ªº¥\¯à¡A¥¦Ì¹ê§@®É¬O¥Î NFAs
(non-deterministic finite automata¡A«D¨M©w¦¡¦³¦Û°Ê¾÷)ªº¡C¨Ã¥B¥¦Ì¥ç«D
POSIX¦¡ªº¡A¦]¬°¨º¼Ë·|³y¦¨¦b©Ò¦³±¡ªp¤U³£¦³³Ì®tªºªí²{¡C(¦ü¥G¦³¨Ç¤H¸ûª`«½T
«O¤@P©Ê¡A§Y¨Ï¨º¦P®É¤]½T«O¤F½wºCªº³t«×)¡C§A¥i¥H¦b Jeffrey Friedl©ÒµÛªº
``ºë³q¥¿³Wªí¥Ü¦¡'' (Mastering Regular Expressions)¤@®Ñ¤¤ (O'Reilly¥Xª©)
¡AÀò±o©Ò¦³§A·Qª¾¹DÃö©ó³o¨Ç¨Æªº©Ò¦³²Ó¸`(¦b perlfaq2¸Ì±¦³¸Ó®Ñªº¸Ô²Ó¸ê®Æ)¡C
grep()
¦b¼gªk¤W¤£¦p for
(¶â¡A§Þ³N¤W»¡¬O
foreach
°Õ)°j°é¡C
°²³]¦³¤@ºØ©Ç²§ªº¤õ¬P»y½s½X¨ó©w¡A¨ä¤¤¨C¨âÓ¤j¼gªº ASCII¦r¥À¥Nªí¤@Ó¤õ¬P ¦r¥À (Ä´¦p ``CV''³o¨âӦ줸²Õ¥Nªí¤@Ó¤õ¬P¦r¥À¡A´N¹³ ``SG''¡B``VS''¡B``XX''¡Aµ¥Âù¦r¤¸²Õ¤@¼Ë)¡C¦Ü©ó¨ä¥¦¦ì¤¸«h©M¦b ASCII ¸Ì¤@¼Ëªí¥Ü³æ¤@¦r¤¸¡C
©Ò¥H¡A¹³ ``I am CVSGXX!''³o¼Ëªº¤õ¬P¦r¦ê¥Î¤F 12Ӧ줸¥hªí¥Ü¤EÓ¦r¥À 'I',' ' ,'a','m',' ','CV','SG','XX','!'¡C
²{¦b°²³]§An·j¯Á³oÓ¦r¥À¡G/GX/
¡CPerl¨Ã¤£À´¤õ¬P»y¡A©Ò¥H¥¦·|§ä¨ì ``I am CVSGXX!''¤¤ ``GX''
³o¨âӦ줸¡A§Y¨Ï¨Æ¹ê¤W³oÓ¦r¥À¨Ã¤£¦b¨ä¤¤¡G¥¦¤§©Ò¥H¬Ý¨Ó¹³¬O¦b¨º¨à¬O¦]¬°
``SG''©M ``XX''ºòÁ{¦b¤@°_½}¤F¡A¹ê»Ú¤W¨Ã«D¯u¦³ ``GX''¦s¦b¡C³o¬OÓ¤j°ÝÃD¡C
¥H¤U¦³¨Ç³B²zªº¤èªk¡AÁöµM³£±o¥I¥X¤£¤Ö¥N»ù¡G
$martian =~ s/([A-Z][A-Z])/ $1 /g; #Åý¬Û¾Fªº¡u¤õ¬P¡v¦ì¤¸¤£¦A¬Û¾F print "§ä¨ì GX¤F!\n" if $martian =~ /GX/;
©Î¹³³o¼Ë¡G
@chars = $martian =~ m/([A-Z][A-Z]|[^A-Z])/g; #¤W±¨º¦æ¦b²z©À¤Wªñ¦ü©ó¡G @chars = $text =~ m/(.)/g; # foreach $char (@chars) { print "§ä¨ì GX¤F!\n", last if $char eq 'GX'; }
³o¼Ë¤]¥i¥H¡G
while ($martian =~ m/\G([A-Z][A-Z]|.)/gs) { #¤]³\¤£»Ýn \G print "§ä¨ì GX¤F!\n", last if $1 eq 'GX'; }
¤£µM°®¯Ü³o¼Ë¡G
die "¹ï¤£°_¡APerl©|¥¼¤ä´©¤õ¬P¤å )-:\n";
°£¦¹¤§¥~¡ACPAN¸Ì±¦³Ó½d¨Òµ{¦¡¯à±N¥b¼e (half-width)ªº¤ù°²¦WÂন¥þ¼e (full-width) [¥H Shift-JIS©Î EUC½s½Xªº]¡A³o¬O«ô Tom¤§½ç¤~¦³ªº¦¨ªG¡C
²{¦b¤w¦³«Ü¦hÂù (©M¦h)¦ì¤¸½s½Xªk³Q¼sªxªº±Ä¥Î¡C³o¨Ç¤èªk¤¤¦³¨Ç¬O±Ä¥Î 1-,2-, 3-,¤Î 4¦ì¤¸²Õ¦r¥À¡A²V¦X¨Ï¥Î¡C
ĶªÌ¡G³¯«Û»Ê
¤¤Ä¶ª©µÛ§@Åv©Ò¦³¡G³¯«Û»Ê¡B¿½¦ÊÄ֤ΨⰦ¦Ñªê¤u§@«Ç ¡C¥»¤¤Ä¶ª©¿í¦u¨Ã¨Ï¥Î»Pì¤åª©¬Û¦Pªº¨Ï¥Î±ø´Úµo¦æ¡C