自家製grep-changelogと、本家grep-changelogの出力に差分がありました。
自家製は、
2008-08-25 Alan Modra <amodra@bigpond.net.au> 2009-08-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> 2009-08-28 H.J. Lu <hongjiu.lu@intel.com> 2010-11-05 Alan Modra <amodra@gmail.com>
本家は、
2007-07-05 Nick Clifton <nickc@redhat.com> 2007-02-28 Alan Modra <amodra@bigpond.net.au> 2007-02-28 Alan Modra <amodra@bigpond.net.au> 2007-02-27 Alan Modra <amodra@bigpond.net.au> 2007-02-27 Alan Modra <amodra@bigpond.net.au> 2007-02-27 Alan Modra <amodra@bigpond.net.au> 2008-08-25 Alan Modra <amodra@bigpond.net.au> 2009-08-28 H.J. Lu <hongjiu.lu@intel.com> 2009-08-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> 2010-11-05 Alan Modra <amodra@gmail.com> 2010-11-05 Alan Modra <amodra@gmail.com> 2010-01-26 Tristan Gingold <gingold@adacore.com>
ずいぶん異なります。
本家ログを見てみるとすぐに気づきますが、同じ日付のタイトルが存在します。
自家製ではタイトルをIDにしているため、同じIDとみなして連想配列を上書きしてしまいますね。
連番の数字を添えることで、同じタイトルが存在しないように修正します。
$numという変数を追加しました。
1 $pattern = $ARGV[0]; 2 3 %log=(); 4 opendir(DIR,"."); 5 @files = grep { /ChangeLog.*/ } readdir(DIR); 6 closedir(DIR); 7 $num = 1; 8 foreach(@files){ 9 open(INFILE,"<$_"); 10 $id = ""; 11 while(<INFILE>){ 12 chomp(); 13 if(/^\d\d\d\d-\d\d-\d\d/){ 14 $id = "$_"; $id .= $num++; 15 next;
修正後の自家製スクリプトを実行すると、
takk@deb9:~/src/binutils-2.28/binutils$ perl t.pl bin2c | sed -ne '/^2/p' 2008-08-25 Alan Modra <amodra@bigpond.net.au>1117 2009-08-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>69 2009-08-28 H.J. Lu <hongjiu.lu@intel.com>64 2010-11-05 Alan Modra <amodra@gmail.com>1453 takk@deb9:~/src/binutils-2.28/binutils$
結果は変わりません。まだ何かあるようです。
ログの抽出条件を確認してみます。
19 if(/^ |^$/ && $id ne ""){ 20 $log{$id} .= "$_"; 21 $found{$id} ++ if(/$pattern/); 22 next; 23 } 24 last;
行頭がタブか、空行の場合に、$foundをインクリメントしてフラグを立ててます。
もしかしたら、この2つ以外の条件に当てはまらないChangelogの書式が存在するのかもしれません。
grepで、行頭がタブではない行を抽出しましょう。vimで眺めて探すことにします。
takk@deb9:~/src/binutils-2.28/binutils$ grep -hv ^$'\t' ChangeLog* | vim -
見つけました。行頭がタブの行はgrepで抽出しないはずなのに、ログ本体があります。
928 2003-12-29 Nick Clifton <nickc@redhat.com> 929 930 called 'debug_line_pointer_sizes'. 931 (num_debug_line_pointer_sizes): New variable. 932 (display_debug_lines): Extract pointer size from the 933 debug_line_pointer_sizes array. 934 (display_debug_loc): Likewise. 935 (prescan_debug_info): Fill in the debug_line_pointer_sizes 936 array.
スペースでした。スペース8個が、行頭に入ってます。
この対策に、ChangeLogファイルの読み込み時に、行頭スペース8個をタブに置換する処理を追加します。
1 $pattern = $ARGV[0]; 2 3 %log=(); 4 opendir(DIR,"."); 5 @files = grep { /ChangeLog.*/ } readdir(DIR); 6 closedir(DIR); 7 8 $num = 1; 9 foreach(@files){ 10 open(INFILE,"<$_"); 11 $id = ""; 12 while(<INFILE>){ 13 chomp(); s/^ /\t/; 14 if(/^\d\d\d\d-\d\d-\d\d/){ 15 $id = "$_"; 16 $id .= $num++; 17 next; 18 }
実行すると、出力されるタイトルが少し増えました。
takk@deb9:~/src/binutils-2.28/binutils$ perl t.pl bin2c | sed -ne '/^2/p' 2007-02-27 Alan Modra <amodra@bigpond.net.au>1704 2007-02-28 Alan Modra <amodra@bigpond.net.au>1703 2007-07-05 Nick Clifton <nickc@redhat.com>1632 2008-08-25 Alan Modra <amodra@bigpond.net.au>1488 2009-08-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>69 2009-08-28 H.J. Lu <hongjiu.lu@intel.com>64 2010-01-26 Tristan Gingold <gingold@adacore.com>2170 2010-11-05 Alan Modra <amodra@gmail.com>2073 takk@deb9:~/src/binutils-2.28/binutils$
しかしまだ本家とは異なります。
つづく
コメント