grep.plline 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 函数の引数のとり方を複数書きましたので、引用符( " )とコンマ( , )の位置を色々試してください。