Re: [请益] 两份log差异比较

楼主: gugod (å•Š)   2020-03-30 09:54:25
nash7555 您好,
粗略看来,您的程式前两段是将原 log 档进行一点过滤,并将筛完之后的
成果存去 TEMPNEW, TEMPORI 。而最后将两档比对的结果存去 DIFFLIST。
最后一段卡关点的程式码尚不完全,但从您的文字描述看来,您预期
TEMPNEW 与 TEMPORI 内容会有部份重复,而这程式的主要目的,则是要
将重复的部份消除后输出到 DIFFLIST。
以下是我的几点建议:
1. 或许可以将档案全数读到内存中试试。如果是读成两个阵列的话,
或许以下这段程式码就能解决前述问题:
my @content_c;
for my $line_a (@content_a) {
my $dup = 0;
for my $line_b (@content_b) {
if ($line_a eq $line_b) {
$dup = 1;
last;
}
}
if ($dup) {
push @content_c, $line_a;
}
}
  print DIFFLIST $_ for @content_c;
虽然我不知道实际上您的要处理的这两个档案多大,
会不会把内存全用掉这我就无法判断了。
2. 如果因故必须采用暂存盘的做法,我印象中,比须使用
seek() (perldoc -f seek) 在适当的时机将档案光标移回开头,例如:
while (my $line_a = <TEMPNEW>) {
my $dup = 0;
seek(TEMPORI, 0, 0);
while(my $line_b = <TEMPORI>) {
...
}
...
}
3. 如果可以使用 cpan 模组 List::Util 中的 `uniq` 函式,前述 (1) 的部份
可以简化为一行:
my @content_c = uniq(@content_a, @content_b);
以上。提供给您参考。
作者: cutekid (可爱小孩子)   2020-03-30 22:07:00
推(Y)
作者: flu (Crazy Rhythm)   2020-04-02 07:31:00
突然想起有Algorithm::Diff 这个模组

Links booklink

Contact Us: admin [ a t ] ucptt.com