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