続きです。
同一オプションが複数指定されたときは、後に指定したものを有効にします。
takk@deb9:~$ cat t.pl $_ = "@ARGV"; s/--text /--text=/g; foreach(split / /){ $text=$1 if(/--text=(\S+)/); } print "$text\n"; takk@deb9:~$ perl t.pl --text=BBB --text=AAA AAA takk@deb9:~$
では、–text以外のオプションも処理しましょう。
takk@deb9:~$ cat t.pl $_ = "@ARGV"; s/--(\w+-?\w+) /--$1=/g; foreach(split / /){ $author=$1 if(/--author=(\S+)/); $text=$1 if(/--text=(\S+)/); $exclude=$1 if(/--exclude=(\S+)/); $from_date=$1 if(/--from-date=(\S+)/); $to_date=$1 if(/--to-date=(\S+)/); } print "$author\n"; print "$text\n"; print "$exclude\n"; print "$from_date\n"; print "$to_date\n"; takk@deb9:~$
使ってみます。
takk@deb9:~$ perl t.pl ' > --author=takk > --text aaaaaaaaa > --exclude bbbbbbbb > --from-date cccccccccc > --to-date dddddddddd > ' takk aaaaaaaaa bbbbbbbb cccccccccc dddddddddd takk@deb9:~$
良い感じです。
このオプション解析を、自作grep-changelogの最初に処理すればできあがりです。
これで–textでパターンを指定可能になりました。
全ソースです。
takk@deb9:~$ cat -n t.pl 1 $_ = "@ARGV"; 2 s/--(\w+-?\w+) /--$1=/g; 3 4 foreach(split / /){ 5 $author=$1 if(/--author=(\S+)/); 6 $text=$1 if(/--text=(\S+)/); 7 $exclude=$1 if(/--exclude=(\S+)/); 8 $from_date=$1 if(/--from-date=(\S+)/); 9 $to_date=$1 if(/--to-date=(\S+)/); 10 } 11 12 %log=(); 13 opendir(DIR,"."); 14 @files = grep { /ChangeLog.*/ } readdir(DIR); 15 closedir(DIR); 16 17 $num = 1; 18 foreach(@files){ 19 open(INFILE,"<$_"); 20 $id = ""; 21 while(<INFILE>){ 22 chomp(); 23 s/^ /\t/; 24 if(/^\d\d\d\d-\d\d-\d\d/){ 25 $title = "$_"; 26 $num=0; 27 $id = $title .':::'. $num++; 28 next; 29 } 30 if(/^ \*/){ 31 $id = $title .':::'. $num++; 32 } 33 if(/^ |^$/ && $id ne ""){ 34 $log{$id} .= "$_"; 35 $found{$id} ++ if(/$text/); 36 next; 37 } 38 last; 39 } 40 41 close(INFILE); 42 } 43 44 foreach(sort keys %log){ 45 $id = $_; 46 @tmp = split /\t/,$log{$_}; 47 48 if($found{$id} > 0){ 49 print "$id\n"; 50 foreach(@tmp){ 51 print" $_\n"; 52 } 53 print"\n"; 54 } 55 } takk@deb9:~$
コメント