如何针对数据数组有效地过滤输入行?

时间:2011-01-31 16:15:18

标签: arrays perl file loops

我正在尝试将文件读入临时变量,根据数组中的项过滤文件。我这样做是通过打开一个文件并在while循环中读取文件,运行另一个循环(非常糟糕的想法IMO)来检查内容是否与数组匹配,如果是这样,该行被丢弃并进入下一个线。

它有效,但当有20,000行输入时它很糟糕。我正在阅读10个项目的数组,这实际上将它变成了200,000行文件。

有没有办法更快地处理?

2 个答案:

答案 0 :(得分:1)

将数组项目拼接成一个大的正则表达式:例如,如果您的数组是qw{red white green},请使用/(red|white|green)/$1变量会告诉您哪一个匹配。如果您需要完全匹配,请锚定终点:/^(red|white|green)$/

答案 1 :(得分:1)

假设您想要在找到数组中的任何项目时丢弃一行,List::MoreUtils中的any函数会在找到匹配后立即停止搜索数组。

use List::MoreUtils qw(any);

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

如果您碰巧知道阵列中哪些项目更有可能出现在您的行中,您可以相应地对数组进行排序。

您还应该Benchmark您的方法,以确保您的优化工作是值得的。