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

続きです。

同一オプションが複数指定されたときは、後に指定したものを有効にします。

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:~$ 

Leave a Reply

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

CAPTCHA