2011-01-31 123 views
0

我想將文件讀入臨時變量,根據數組中的項過濾文件。我通過打開一個文件並在讀取文件的while循環中執行此操作,運行另一個循環(非常糟糕的想法IMO)來檢查內容是否與數組匹配,如果是這樣,則該行被丟棄,並且繼續下一個循環線。如何根據數據數組有效地過濾輸入行?

它可以工作,但有20,000行輸入時它很糟糕。我正在閱讀10個項目的數組,基本上將它變成200,000行文件。

有沒有辦法處理這個更快?

回答

1

假設你想,如果你的數組中的任何項目被發現丟棄線,從List::MoreUtilsany功能將立即停止通過數組搜索,因爲它已經找到了匹配。

use List::MoreUtils qw(any); 

while (<>) { 
    my $line = $_; 
    next if any { $line =~ /$_/ } @list; 
    # do your processing 
} 

如果你碰巧知道您的數組中的項目更有可能在你的線條出現,您可以據此進行排序的數組。

你也應該Benchmark你的方法,以確保您的優化的努力是值得的。

+0

這是我所需要的,我將如何去執行此if語句,而不是next如果。我需要它省略整條線而不僅僅是陣列。我試着做If(任何{$ line =〜/ $ _ /} @list;)但失敗。有任何想法嗎? – jinanwow 2011-01-31 19:14:33

1

將數組項整合爲一個大的正則表達式:例如,如果您的數組是qw{red white green},請使用/(red|white|green)/。變量$1會告訴你哪一個匹配。如果您需要完全匹配,請確定終點:/^(red|white|green)$/

+0

你可以用Perl的grep的(http://perldoc.perl.org/functions/grep.html)對所有行的數組結合這一點,所以你並不需要在所有的任何環路(提供輸入文件是不是太大) – 2011-01-31 16:26:21

相關問題