grep.pl
line 1-2:
コメント行で、 perl
の所在地です。
line 3-6:
if
節で、コマンドライン引数の個数が最低 2 個未満の場合、終了する。2 個以上あれば、 6-24 行目の else
節を実行する。
配列は、スカラー値として呼び出された場合は、要素の個数を返すことを確認してください。これをスカラー・コンテキストと呼びます。
@ARGV
は、コマンドライン引数を要素とする Perl の内部で定義済みの特殊な配列です。
exit
はスクリプトを終了させる組込み関数です。繰り返しブロックから脱出する last
, next
と区別してください。
line 6-24:
3 行目の if
条件文が偽であれば実行される else
節です。コマンドライン引数が二つ以上あれば実行されます。
line 7: 配列操作 shift
shift
函数は、配列から第一要素を抜き出して、残りの要素を配列の中で前に詰めます。つまり、四つの要素を持つ配列に shift
を作用させると、要素は三つになります。
@array $val=shift(@array); $val @array a, b, c, d, e -> a b, c, d, e
今の場合は、コマンドラインの第一引数を変数 $pattern
に代入して、残りの引数をひとつ前に詰めます。これ以降、配列 @ARGV
にはコマンドラインの第二引数以降(FILENAME)しか代入されていません。
8 行目で配列 @ARGV
を出力していますので、確認してください。
line 9-20: foreach
ループ
foreach
節は繰り返しを表す for
節に似ています。
foreach
節は次のような形をしています;
foreach $val (@array) { 繰り返しブロック }
配列 @array
から第一要素を抜き出して変数 $val
に代入し、ブロック内を実行します。次に第二要素に対して同じことを繰り返し、配列の最後の要素に至るまで同じように繰り返します。
このスクリプトでは、 @ARGV
の各要素を変数 $filename
に代入して 10-19 行目を繰り返します。
foreach
節は、配列の各要素に対して同じ操作を繰り返すときに便利です。
line 10:
10 行目以降では、配列 @ARGV
の要素を変数 $filename
に代入されています。
$filename
に代入されているファイル名のファイルを開き、 SEARCH
と名付けたハンドルに結び付けています。ハンドル名は何でも構いません。
line 12-17:
お馴染みになってきました、 while
ループです。
繰り返しの条件文は $line = <SEARCH>
で、ファイルハンドル <SEARCH>
が扱う、 $filename
に代入されているファイル名が表すファイルからの一行入力を変数 $line
に代入してブロック内を実行します。
ファイルハンドルが繰り返し条件式に現れると、ファイルから一行づつ次々に入力して繰り返し、 ファイルが最後の行まで終了して、ハンドルから代入できなくなれば偽を返し、繰り返しが終了します。
line 13-16:
これもお馴染み if
節です。
7 行目でコマンドライン @ARGV
から抜き出した $pattern
を正規表現として、 $line
にマッチする部分があるかどうかを判定します。
マッチする部分があれば、カウント数をひとつ増やして($counts++
は $counts = $counts + 1
の省略形)、 15 行目の出力をします。
この繰り返しが終了すると、 $counts
には当該ファイルでマッチした回数が代入されます。
line 18: 配列操作 push
7 行目の shift
に似ています。
push
は配列の最後に要素を付け加えます。
このスクリプトでは配列 @score
を新たに定義し、$counts
を最後の要素に付け加えます。
@score
には最終的に、サーチしたファイルの個数分(foreach
ループで繰り返した回数分)だけの要素が生成されています。
line 21-23:
スクリプト終了時に表示するメッセージです。 print
函数の引数のとり方を複数書きましたので、引用符( "
)とコンマ( ,
)の位置を色々試してください。