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

続きです。日付オプションです。

日付を指定してフィルタリングするのは、判定が難しそうですが、-(ハイフン)を取り除いてしまえば、単なる数値の比較に過ぎません。
内部では、-(ハイフン)なしの10桁数字で扱うことにします。

ソースです。
5,6行目でオプションを指定しない場合の初期値として、$from_dateには、最小値であるオール0。$to_dateには、最大値のオール9を設定しています。

takk@deb9:~$ cat -n t.pl
     1	$_ = "@ARGV";
     2	s/--(\w+-?\w+) /--$1=/g;
     3	$author='.*';
     4	$text='.*';
     5	$from_date='00000000';
     6	$to_date  ='99999999';
     7	
     8	foreach(split / /){
     9		$author=$1 if(/--author=(\S+)/);
    10		$text=$1 if(/--text=(\S+)/);
    11		$exclude=$1 if(/--exclude=(\S+)/);
    12		$from_date=$1.$2.$3 if(/--from-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/);
    13		$to_date=$1.$2.$3 if(/--to-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/);
    14	}
    15	
    16	printf"--from-date %s\n",$from_date;
    17	printf"--to-date %s\n",$to_date;
    18	
    19	exit 0;
    20	

12,13行目で、オプションに取り込み時に、-(ハイフン)を削除するようにしてます。

今回は、日付オプションの取り込み部分のみ作るので、16,17行目に確認用のprintfを追加し、19行目でスクリプト終了するように改造しました。

では、確認してみます。

takk@deb9:~$ perl t.pl --from-date=2000-01-01
--from-date 20000101
--to-date 99999999
takk@deb9:~$ perl t.pl --to-date=2000-01-01
--from-date 00000000
--to-date 20000101
takk@deb9:~$ perl t.pl --from-date=2000-01-01 --to-date=2000-01-02
--from-date 20000101
--to-date 20000102
takk@deb9:~$ 

うまく取り込めてるようです。

確認しながら気づきましたが、日付指定を間違えるパターンも考えなければなりません。
16~19行目に、日付の大小チェックを追加しました。

     8	foreach(split / /){
     9		$author=$1 if(/--author=(\S+)/);
    10		$text=$1 if(/--text=(\S+)/);
    11		$exclude=$1 if(/--exclude=(\S+)/);
    12		$from_date=$1.$2.$3 if(/--from-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/);
    13		$to_date=$1.$2.$3 if(/--to-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/);
    14	}
    15	
    16	if($from_date > $to_date){
    17		print"parameter error --from-date --to-date\n";
    18		exit 1;
    19	}
    20	
    21	printf"--from-date %s\n",$from_date;
    22	printf"--to-date %s\n",$to_date;
    23	
    24	exit 0;
    25	

確認。

takk@deb9:~$ perl t.pl --from-date=2000-01-02 --to-date=2000-01-01
parameter error --from-date --to-date
takk@deb9:~$ 

パラメータエラーって、本家はどのように表示してたんでしょうか。確認してみます。

takk@deb9:~$ grep-changelog --from-date=2020-01-01 --to-date=2000-01-01 ChangeLog*
takk@deb9:~$ 

何も表示されません。エラーと表示するべきではないかもしれませんね。フィルタした結果として1件も表示されない、ってのが正しいあり方でしょう。
では、本家に倣って、パラメータエラーの表示を削除して、今回はこれで出来上がりです。

takk@deb9:~$ cat -n t.pl
     1	$_ = "@ARGV";
     2	s/--(\w+-?\w+) /--$1=/g;
     3	$author='.*';
     4	$text='.*';
     5	$from_date='00000000';
     6	$to_date  ='99999999';
     7	
     8	foreach(split / /){
     9		$author=$1 if(/--author=(\S+)/);
    10		$text=$1 if(/--text=(\S+)/);
    11		$exclude=$1 if(/--exclude=(\S+)/);
    12		$from_date=$1.$2.$3 if(/--from-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/);
    13		$to_date=$1.$2.$3 if(/--to-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/);
    14	}
    15	
    16	if($from_date > $to_date){
    17		exit 1;
    18	}
    19	

コメント

タイトルとURLをコピーしました