Category Archives: 4-1.文字列検索

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

続きです。

自作grep-changelogまずはバグ修正。3,4行目の$author、$textが、「.*」となっていたため、空行もヒットしてました。1文字以上とするため*を+に変更しました。

     1	$_ = "@ARGV";
     2	s/--(\w+-?\w+) /--$1=/g;
     3	$author='.+';
     4	$text='.+';
     5	$from_date='00000000';
     6	$to_date  ='99999999';
     7	

56,57行目で、ハイフン入り日付書式を$dtにハイフンなしの形に変換しています。
その$dtを使用しての日付のフィルタを60,61行目で処理しています。

    54	foreach(sort keys %log){
    55		$id = $_;
    56		/^(....).(..).(..)/;
    57		$dt = $1.$2.$3;
    58		@tmp = split /\t/,$log{$_};
    59	
    60		next if($dt < $from_date);
    61		next if($dt > $to_date);
    62	
    63		if($found{$id} > 0){
    64			if($id =~ /$author/){
    65				print "$id\n";
    66				foreach(@tmp){
    67					print"	$_\n";
    68				}	
    69				print"\n";
    70			}
    71		}
    72	}
takk@deb9:~/src/binutils-2.28/binutils$ 

63,64行目のifも、同じく1行にしてしまえば、見やすくなりますね。

ファイル名もt.plから、my-grep-changelog.plに変更。
全ソースです。完成に近づいてきました。

takk@deb9:~/src/binutils-2.28/binutils$ cat -n my-grep-changelog.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	
    20	%log=();
    21	opendir(DIR,".");
    22	@files = grep { /ChangeLog.*/ } readdir(DIR);
    23	closedir(DIR);
    24	
    25	$num = 1;
    26	foreach(@files){
    27		open(INFILE,"<$_");
    28		$id = "";
    29		while(<INFILE>){
    30			chomp();
    31			s/^        /\t/;
    32			if(/^\d\d\d\d\-\d\d\-\d\d/){
    33				$title = "$_";
    34				$num=0;
    35				$id = $title .':::'. $num++;
    36				next;
    37			}
    38			if(/^	\*/){
    39				$id = $title .':::'. $num++;
    40			}
    41			if(/^	|^	\*|^$/ && $id ne ""){
    42				if(/$text/){
    43					$log{$id} .= "$_";
    44					$found{$id} ++;
    45				}
    46				next;
    47			}
    48			last;
    49		}
    50	
    51		close(INFILE);
    52	}
    53	
    54	foreach(sort keys %log){
    55		$id = $_;
    56		/^(....).(..).(..)/;
    57		$dt = $1.$2.$3;
    58		@tmp = split /\t/,$log{$_};
    59	
    60		next if($dt < $from_date);
    61		next if($dt > $to_date);
    62		next if($dt > $to_date);
    63		next if($found{$id} <= 0);
    64		next unless($id =~ /$author/);
    65	
    66		print "$id\n";
    67		foreach(@tmp){
    68			print"	$_\n";
    69		}	
    70		print"\n";
    71	}
takk@deb9:~/src/binutils-2.28/binutils$