続きです。
同一オプションが複数指定されたときは、後に指定したものを有効にします。
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:~$


コメント