【发布时间】:2011-06-18 16:45:34
【问题描述】:
我正在尝试将文件读入临时变量,根据数组中的项目过滤文件。我通过打开一个文件并在读取文件的while循环中执行此操作,运行另一个循环(非常糟糕的IMO)以检查内容是否与数组匹配,如果是,则丢弃该行并继续下一个行。
它可以工作,但是当有 20,000 行输入时就不好了。我正在阅读一个包含 10 个项目的数组,这实际上将它变成了一个 200,000 行的文件。
有没有办法更快地处理这个问题?
【问题讨论】:
我正在尝试将文件读入临时变量,根据数组中的项目过滤文件。我通过打开一个文件并在读取文件的while循环中执行此操作,运行另一个循环(非常糟糕的IMO)以检查内容是否与数组匹配,如果是,则丢弃该行并继续下一个行。
它可以工作,但是当有 20,000 行输入时就不好了。我正在阅读一个包含 10 个项目的数组,这实际上将它变成了一个 200,000 行的文件。
有没有办法更快地处理这个问题?
【问题讨论】:
假设您想在找到数组中的任何项目时丢弃一行,List::MoreUtils 中的 any 函数将在找到匹配项后立即停止搜索数组。
use List::MoreUtils qw(any);
while (<>) {
my $line = $_;
next if any { $line =~ /$_/ } @list;
# do your processing
}
如果您碰巧知道数组中的哪些项目更有可能出现在行中,则可以对数组进行相应的排序。
您还应该Benchmark 您的方法以确保您的优化工作是值得的。
【讨论】:
将数组项混合成一个大的正则表达式:例如,如果您的数组是qw{red white green},则使用/(red|white|green)/。 $1 变量会告诉您匹配的是哪一个。如果您需要精确匹配,请锚定端点:/^(red|white|green)$/。
【讨论】: