\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