続きです。日付オプションです。
日付を指定してフィルタリングするのは、判定が難しそうですが、-(ハイフン)を取り除いてしまえば、単なる数値の比較に過ぎません。
内部では、-(ハイフン)なしの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
コメント