第 4 回 - Perl 入門(2)

[10/23, 2009 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【例題 3】

課題 2-1

例題 2 のスクリプトを改良し, パターンにマッチする部分を [ ] で囲んで表示するようにしなさい.

(実行例)

     $ perl find_pattern.pl foo.txt
     [8525ax]
     yyy[089927by]xxxx

※パターンマッチを行った直後には,それぞれ次に示す特別な変数が使える. これらを if 文の中で活用するとよい.
記号 意味
$& 最後に行ったパターンマッチにおいて,パターンにマッチした部分の内容
$` 最後に行ったパターンマッチにおいて,パターンにマッチした部分より前(左)の内容
$' 最後に行ったパターンマッチにおいて,パターンにマッチした部分より後(右)の内容

試しに以下のサンプルスクリプトを実行してみると動きが分かる:
     while ( $line = <> ){
        if ( $line =~ /\d+(ax|by)/ ){
           print "(前)=", $`, "\n";
           print "(マッチ部分)=", $&, "\n";
           print "(後)=", $', "\n";
        }
     }

課題 2-2

C のソースファイルを入力とし, 数字の代入が登場している行のみを行番号付きで表示する Perl スクリプト find_assign.pl を作りなさい.
ただし,ここでは便宜上,次のパターンを「数字の代入」と定義する (「」は説明の都合上付けているだけである):
   「1 個以上の空白」 「=」 「0 個以上の空白」 「+ または -」 「1 個以上の数字
なお 「 + または - 」の部分だけは省略してもよいものとする. ※パターン表現の中で + を書く時は \+ を使用

(実行例)

     $ perl find_assign.pl foo.c
     11:   sum = 0;
     12:   for ( x = 1; x <= N; x++ ){

(ヒント)
この画面の下部に示した文字集合の表現例(一覧表)を参考にするとよい. (例題 2 解説の再掲)
なお,ある文字を 省略してもよい とは, その文字が「0 個または 1 個」という意味である.

入力ファイル(課題 2-1 と同じ)
sample1.c sample2.c sample3.c sample4.c sample5.c
sample6.c sample7.c sample8.c sample9.c sample10.c


(参考)文字集合の表現
表記 意味
[asdf] a, s, d, f の中のどれか一文字
[^asdf] a, s, d, f 以外の一文字
[a-f] a, b, c, d, e, f の中のどれか一文字
[a-zA-Z_] アルファベット(小文字,大文字)または _ のいずれか一文字
\d 数字
\D 数字以外
\w 英数字または _ のいずれか一文字
\W 英数字でも _ でもない一文字
\s 空白文字(改行やタブも含む)
\S 空白文字(改行やタブも含む)以外
\d* 数字の 0 個以上の繰り返し(※\d 以外でも同様)
\d+ 数字の 1 個以上の繰り返し(※\d 以外でも同様)
\d? 数字が 0 個または 1 個(※\d 以外でも同様)
\d{3,10} 数字が 3 個以上 10 個以下(※\d 以外でも同様)
\d{3,} 数字が 3 個以上 (※\d 以外でも同様)
\+ + を表現したいとき( + だけだと直前のパターンを 1 回以上と誤解される)
他の特殊記号も同様: *, {, }, [, ], ^, $, ?