ChangeLogオプション解析(その1)

前回までは、自作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:~$ 

上手くいきました。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA