|
課題 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 回以上と誤解される)
他の特殊記号も同様: *, {, }, [, ], ^, $, ?
|
|