perlfaq6 - perl±`°Ý°ÝÃD¶°¡A²Ä¤»½g

¥Ø¿ý


½g¦W

perlfaq6 -¥¿³Wªí¥Ü¦¡¡(­ì¤åª© Revision: 1.17, Date: 1997/04/24 22:44:10 ¤¤Ä¶ª© $Revision: 1.4 $, $Date: 1997/08/03 17:22:55 $)


·§­z

¥»¸`¤§©Ò¥H¥X¤H·N®Æ¦a¤p¬O¦]¬°¦b³o¥÷ FAQ ªº¨ä¥¦³¡¥÷¤w´²¥¬µÛ»P¥¿³Wªí¥Ü¦¡¦³Ãöªºµª®×¤F¡C¨Ò¦p»¡¡A±q¤@¦ê¤å¦r¤¤Â^¨ú URL¡A¥H¤ÎÀˬd¦r¦ê¬O§_§t¼Æ¦r¡A³o¨Ç³£¬O¥H¥¿ ³Wªí¥Ü¦¡¨Ó³B²zªº¡A¦ý¬O³o¨Ç°ÝÃDªºµª®×±o¨ì¥» FAQªº¨ä¥¦³¡¥÷¥h§ä (§óºë½T¦a»¡¡A¬O¸ê®Æ©Mºô¸ô¨º¨â³¡¥÷)¡C


§Ú¸Ó¦p¦ó¨Ï¥Î¥¿³Wªí¥Ü¦¡¤~¤£¦Ü©ó¼g¥X¤£¦X»yªk¥BÃø¥HºûÅ@ªºµ{¦¡½X?

¥H¤U´£¨Ñ¤T­Ó§Þ¥©¨Ï±o§Aªº¥¿³Wªí¥Ü¦¡©öÀ´¤S¦nºûÅ@¡C

¦b¥¿³Wªí¥Ü¦¡¥~³ò§@µù¸Ñ¡C
¥Î Perlªºµù¸Ñ¤è¦¡´y­z§A©Ò§@ªº¨Æ¥H¤Î§A¦p¦ó§@¨ì¥¦¡C

    #§â¨C¦æÅܦ¨¡u²Ä¤@­Ó¦r¡B«_¸¹¡A©M³Ñ¾lªº¦r¤¸¼Æ¡v³o¼Ëªº®æ¦¡¡C
    s/^(\w+)(.*)/ lc($1) . ":" . length($2) /ge;

¦b¥¿³Wªí¥Ü¦¡¤º³¡§@µù¸Ñ¡C
/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

´«­Ó¤£¦Pªº°Ï¹j¦r¤¸ (delimiter)¡C
¾¨ºÞ§Ú­Ì¥­±`³£§â¥¿³Wªí¥Ü¦¡ªº¼Ò¦¡ (patterns)·Q§@¬O¥H /¦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?!


§ÚµLªk¹ïÀ³¨ì¶W¹L¤@¦æªº¤º®e¡A­þ¸Ì¥X¤F°ÝÃD?

­Y¤£¬O§Aªº¦r¦ê¸Ì¤Ö¤F´«¦æ¦r¤¸¡A´N¬O§A¦b¼Ò¦¡¸Ì¥Î¤F¿ù»~ªº­×¹¢¤l¡C

¦³«Ü¦h¤èªk±N¦h¦æªº¸ê®Æµ²¦X¦¨¤@­Ó¦r¦ê¡C¦pªG§A§Æ±æ¦bŪ¤J¿é¤J¸ê®Æ®É¦Û°Ê±o¨ì ³o¶µ¥\¯à¡A§A±o­«·s³]©w $/ÅÜ¼Æ (­Y¬°¬q¸¨¡A³]¦¨ ''¡F­Y­n±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";
        }
    }


§Ú¦p¦ó¨ú¥X¦ì©ó¤£¦P¦æªº¨â­Ó¼Ò¦¡¶¡¤§¤º®e?

§A¥i¥H¨Ï¥Î¬Ý°_¨Ó¦³ÂI©Çªº Perl ..¹Bºâ¤¸ (¦b perlop¤å¥ó¤¤¦³»¡©ú):

    perl -ne 'print if /START/ .. /END/' file1 file2 ...

¦pªG§A­nªº¬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ªí¥Ü¦¡©ñ¤J $/¦ý«o¨S¦³¥Î¡C¿ù¦b­þ¸Ì?

$/¥²¶·¬O­Ó¦r¦ê¡A¤£¯à¬O¤@­Ó¥¿³Wªí¥Ü¦¡¡CPerl±o¯d¤@¤â¡AÅý AwkÁÙ¦³ÂI¥iź¶Æ ¤§³B¡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;


¦p¦ó¦b LHSºÝ¡iĶµù¡G¦¡¤l¤¤¹Bºâ¤¸¥ªºÝ³¡¥÷¡j§@¤£°Ï§O¤j¤p¼g¦¡ªº´À´«¡A¦ý¦b RHSºÝ¡i¥kºÝ¡j«O¯d¤j¤p¼g°Ï§O?

µª®×ºÝ¬Ý§A¦p¦ó©w¸q¡u«O¯d¤j¤p¼g°Ï§O¡v(preserving case)¡C¤U­±³o­Óµ{¦¡¨Ì·Ó¨C­Ó ¦r¥Àªº¶¶§Ç¡A¦b´À´«°Ê§@§¹¦¨«á«O¯d­ì¨Óªº¤j¤p¼g¡C¦pªG¥Î¨Ó´À´«ªº¦r¨ä¦r¥À¼Æ¤ñ³Q´À ´«ªÌ¦h¡A¨º»ò³Ì«á¤@­Ó¦r¥Àªº¤j¤p¼g´N·|³Q¥Î§@¨M©w´À´«¦r³Ñ¾l¦r¥Àªº¤j¤p¼g¤§¨Ì¾Ú¡C

    #­ì§@ªÌ¬° 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


¦p¦ó¨Ï \w¹ïÀ³¨ìªþ­«­µ°O¸¹ (accented)ªº¦r¤¸?

½Ð°Ñ¦Ò perllocale»¡©ú¤å¥ó¡C


¦p¦ó§@¤@­Ó¾A¦X¤£¦P locale¡iĶµù¡G°ê®a¡B¦a°Ï¦b¤å¦r½s½X¤W¦U¦ÛªººD¨Ò¡jªº /[a-zA-Z]/¹ïÀ³?

¤@­Ó¦r¥À¥i¥H¥Î /[^\W\d_]/ªí¥Ü¡A¤£½×§Aªº locale¬°¦ó¡C«D¦r¥À«h¥i¥Î /[\W\d_]/ªí¥Ü (°²©w§A¤£§â ``_''·í¦¨¦r¤¸)¡C


¦b¤@­Ó¥¿³Wªí¥Ü¦¡¸Ì¦p¦ó¤Þ¤J (quote)ÅܼÆ?

Perl¸ÑªR¾¹©ó¶¡¹j¦r¤¸¤£¬O³æ¤Þ¸¹®É¡A·|®i¶}¥¿³Wªí¥Ü¦¡¸Ìªº $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»ò¥Îªº?

·í§A¦b¤@­Ó¥¿³Wªí¥Ü¦¡¸Ì¥Î¤@­ÓÅܼƨӧ@¹ïÀ³®É¡A¨C¦¸³q¹L¥¦®É³£­n­«·sµû¦ô¤@¦¸(re- evaluation)¡A¦³®É¬Æ¦Ü­n­«·s½sĶ(recompilation)¡C/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;
    }


¦p¦ó¨Ï¥Î¥¿³Wªí¥Ü¦¡±NÀɮפ¤ C»y¨¥¼Ë¦¡ªºµù¸Ñ§R±¼?

ÁöµM³o¥ó¨Æ¹ê»Ú¤W°µ±o¨ì¡A¦ý«o¤ñ§A·Q¹³¤¤§ó¥[§xÃø¡C¨Ò¦p¤U­±ªº³æ¦æ¤pµ{¦¡ (one-liner)¡G

    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


§Ú¯à¥Î Perlªº¥¿³Wªí¥Ü¦¡¥h¹ïÀ³¦¨¹ïªº²Å¸¹¶Ü?

ÁöµM Perlªº¥¿³Wªí¥Ü¦¡¤ñ¡u¼Æ¾Çªº¡v¥¿³Wªí¥Ü¦¡­n¨Ó±o±j¤j¡A¦]¬°¥¦­Ì¦³°l·¹«e¬q (\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


¦³¤H»¡¥¿³Wªí¥Ü¦¡«Ü³g°ý¡A¨º¬O¤°»ò·N«ä?¸Ó¦p¦óÁקK¥¦©Ò±a¨Óªº°ÝÃD?

¤j³¡¤Àªº¤H©Ò»¡ªº³g°ý¬O«ü¥¿³Wªí¥Ü¦¡·|ºÉ¥i¯à¦a¹ïÀ³¨ì³Ì¦hªºªF¦è¡C§Þ³N¤W¨Ó»¡¡A¯u¥¿³g°ý ªº¬O¶q¤Æ¤l (?, *, +,{})¦Ó«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


¦p¦ó³B²z¨C¤@¦æªº¨C­Ó¦r?

¥Î split¨ç¼Æ¡G

    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§@ªº°Ê§@
        }
    }


§Ú¦p¦ó¦L¥X¤å¦r¥X²{ÀW²v©Î¦æ¥X²{ÀW²vªººõ­n?

­n§@¨ì³oÂI¡A§A±o¸ÑŪ¡B¤ÀªR¿é¤J¦r¤¸¬y¤ºªº¨C­Ó¦r¡C¦b¦¹§Ú­Ì°²³]©Ò¿×ªº¡u¦r¡v §½­­©ó¤@¦ê¥Ñ¦r¥À¡B³s¦r¸¹¡A©ÎºJ¸¹©Ò²Õ¦¨ªº¦r¡A¦Ó«D«e¤@°ÝÃD¤¤´£¨ìªº¤@¦ê «DªÅ¥Õ¦r¤¸¶°¦X¨ººØ·§©À¡G

    while (<>) {
        while ( /(\b[^\W_\d][\w'-]+\b)/g ) {   # "`sheep'"·|º|¥¢±¼
            $seen{$1}++;
        }
    }
    while ( ($word, $count) = each %seen ) {
        print "$count $word\n";
    }

¦pªG§A­nºâ¦æ¼Æ¡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


¦p¦ó¯à§@ªñ¦ü¹ïÀ³?

°Ñ¦Ò CPAN¸Ìªº String::Approx¼Ò²Õ¡C


§Ú¦p¦ó¦³®Ä²v¦a¤@¦¸¹ïÀ³¦h­Ó¥¿³Wªí¥Ü¦¡?

¤U­±¬O­Ó¶W¨S®Ä²vªº¨Ò¤l¡G

    while (<FH>) {
        foreach $pat (@patterns) {
            if ( /$pat/ ) {
                # do something
            }
        }
    }

­nÁקK¥H¤Wªº¤èªk¡A­n¤£§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?

¦³¨â­Ó±`¨£ªº¿ù»~Æ[©À¬O±N \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¬Û·í¦³¥Î¡C­n¬Ý¬Ý¥¿½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


¬°¤°»ò¨C·í§Ú¥Î $&, $`,©Î $'®Éµ{¦¡ªº³t«×´NºC¤U¨Ó¤F©O?

¦]¬°¤£ºÞ¦bµ{¦¡¤¤­þ¤@­Ó¨¤¸¨¡A¤@¥¹ Perl¬Ý¨£§A»Ý­n³oÃþªºÅܼƮɡA¥¦´N±o ¦b¨C¦¸¼Ò¦¡¹ïÀ³®É·Ç³Æ¦n´£¨Ñ³o¨ÇÅܼƪº­È¡C$1, $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


¥¿³Wªí¥Ü¦¡¤¤ªº \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²{¦b­n§â¨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


Perl¥¿³Wªí¥Ü¤ÞÀº¬O DFAs©Î NFAs?¥¦­Ì¬O POSIX¬Û®eªº¶Ü?

¾¨ºÞ Perlªº¥¿³Wªí¥Ü¦¡¬Ý¦ü 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


¦bµL»¼¦^ªº³õ¦X¤U¥Î grep©Î map¦³¤°»ò¤£¹ï?

ÄY®æ¦a»¡¨Ó¡A¨S¦³¤°»ò¤£¹ï¡C¤£¹L´N®æ¦¡ªº¨¤«×¬Ý¨Ó¡A³o¼Ë·|³y¦¨¤£©öºûÅ@ªºµ{¦¡½X¡C ¦]¬°§A¬O¨Ï¥Î¤F¥L­Ìªº°Æ§@¥Î (side-effects)¦Ó«D¨Ï¥Î¥L­Ìªº¶Ç¦^­È¡A¤£©¯ªº¬O¡A °Æ§@¥Î®e©öÅý¤H·d²V¡CµL»¼¦^¦¡ªº grep()¦b¼gªk¤W¤£¦p for (¶â¡A§Þ³N¤W»¡¬O foreach°Õ)°j°é¡C


¦p¦ó¹ïÀ³¦h¦ì¤¸²Õ¦r¥À©Òºc¦¨ªº¦r¦ê?

³o«ÜÃø¡A¨Ã¥BÁÙ¨S¦³¦nªº¤èªk¡CPerl ¨Ã¤£ª½±µ¤ä´©¦h¦ì¤¸²Õ¦r¥À¡C¥¦°²¸Ë¤@­Ó¦ì¤¸²Õ©M ¤@­Ó¦r¥À¬O¦P¸qªº¡C¤U­±´£¨Ñªº¤èªk¨Ó¦Û Jeffrey Friedl¡A¥L¦³¤@½gµn¦b Perl´Á¥Z (The Perl Journal)²Ä¤­´Áªº¤å³¹°Q½×ªº¥¿¬O³o­Ó°ÝÃD¡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°²³]§A­n·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


§@ªÌ»Pª©Åv¨Æ©y

Copyright (c) 1997 Tom Christiansen and Nathan Torkington. All rights reserved.¦³Ãö¨Ï¥Î¡B¡]Âà¡^µo¦æ¨Æ©y¡A¸Ô¨£ perlfaq

ĶªÌ¡G³¯«Û»Ê

¤¤Ä¶ª©µÛ§@Åv©Ò¦³¡G³¯«Û»Ê¡B¿½¦ÊÄ֤ΨⰦ¦Ñªê¤u§@«Ç ¡C¥»¤¤Ä¶ª©¿í¦u¨Ã¨Ï¥Î»P­ì¤åª©¬Û¦Pªº¨Ï¥Î±ø´Úµo¦æ¡C