自家製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$
しかしまだ本家とは異なります。
つづく


コメント