前回までは、自作grep-changelogで、以下のように$ARGV[0]に格納された文字列をパターンとして解釈していました。
$pattern = $ARGV[0];
本家grep-changelogでは、–text=’パターン文字列’というように、オプションで指定するようになっています。自作版でも同じようなオプションを設けたいと思います。
はて、どのようなオプションがあるのでしょう。
grep-changelogをパラメータなしで実行すると、使用可能なオプションの解説が表示されます。
takk@deb9:~$ grep-changelog Usage: /usr/bin/grep-changelog [options] [CHANGELOG...] Print entries in ChangeLogs matching various criteria. Valid options are: --author=AUTHOR Match entries whose author line matches regular expression AUTHOR --text=TEXT Match entries whose text matches regular expression TEXT --exclude=TEXT Exclude entries matching TEXT --from-date=YYYY-MM-DD Match entries not older than given date --to-date=YYYY-MM-DD Match entries not younger than given date --rcs-log Format output suitable for RCS log entries --with-date Print short date line in RCS log --reverse Show entries in reverse (chronological) order --version Print version info --help Print this help If no CHANGELOG is specified scan the files "ChangeLog" and "ChangeLog.N+" in the current directory. Old-style dates in ChangeLogs are not recognized. takk@deb9:~$
まずは、–textから実装していきます。
パラメータのどの位置にオプションがあっても、解析できるように、foreachで処理します。
takk@deb9:~$ cat t.pl foreach(@ARGV){ if(/--text=(\S+)/){ $text=$1; print "$text\n"; } } takk@deb9:~$
確認。
takk@deb9:~$ perl t.pl --text=AAA AAA takk@deb9:~$
問題ないですね。
本家では、「–text=文字列」、という指定だけでなく、「–text 文字列」、というような空白で指定することもできたと思います。確認してみます。
takk@deb9:~/src/binutils-2.28/binutils$ grep-changelog --text=bin2c ChangeLog-2007>result takk@deb9:~/src/binutils-2.28/binutils$ grep-changelog --text bin2c ChangeLog-2007 | diff -q - result takk@deb9:~/src/binutils-2.28/binutils$
一致したので、使えますね。
「–text,文字列」(カンマ区切り)は、どうでしょうか
takk@deb9:~/src/binutils-2.28/binutils$ grep-changelog --text,bin2c ChangeLog-2007 | diff -q - result Unknown option: text,bin2c ファイル - と result は異なります takk@deb9:~/src/binutils-2.28/binutils$
使えないようです。とりあえず、=と空白の両方に対応することにします。
これでいけるでしょうか。
takk@deb9:~$ cat t.pl foreach(@ARGV){ if(/--text[= ](\S+)/){ $text=$1; print "$text\n"; } } takk@deb9:~$ perl t.pl --text AAA takk@deb9:~$
ダメですねえ。
空白を使ってしまうと、配列の同一要素とならないため、このスクリプトでは解析できません。
先に空白から=へ置換をすることで、対応できるように改造します。
takk@deb9:~$ cat t.pl $_ = "@ARGV"; s/--text /--text=/g; foreach(split / /){ if(/--text=(\S+)/){ $text=$1; print "$text\n"; } } takk@deb9:~$ perl t.pl --text AAA --text=BBB AAA BBB takk@deb9:~$
上手くいきました。
コメント