【问题标题】:How do I efficiently filter lines of input against an array of data?如何根据数据数组有效过滤输入行?
【发布时间】:2011-06-18 16:45:34
【问题描述】:

我正在尝试将文件读入临时变量,根据数组中的项目过滤文件。我通过打开一个文件并在读取文件的while循环中执行此操作,运行另一个循环(非常糟糕的IMO)以检查内容是否与数组匹配,如果是,则丢弃该行并继续下一个行。

它可以工作,但是当有 20,000 行输入时就不好了。我正在阅读一个包含 10 个项目的数组,这实际上将它变成了一个 200,000 行的文件。

有没有办法更快地处理这个问题?

【问题讨论】:

    标签: arrays perl file loops


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您可以将它与 perl 的 grep (perldoc.perl.org/functions/grep.html) 结合起来针对所有行的数组,因此您根本不需要任何循环(前提是您的输入文件不是太大)跨度>
      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2014-02-23
      • 2022-10-15
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多