| 
     
     
     
     | 
    
     
     
      課題 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 と同じ)
      
      
     (参考)文字集合の表現
     
      
       | 
	表記
        | 
       
	意味
        | 
       
      
       | 
	[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 回以上と誤解される) 
	他の特殊記号も同様: *, {, }, [, ], ^, $, ?
        | 
       
      
     |