如何在perl中使用hash来减少循环的使用?

时间:2015-09-28 03:39:28

标签: perl loops hash

例如,首先,我已经确定了几个关键词。然后,在另一个文件中,我想找到与这些关键词完全匹配的行。

使用循环,我会遍历每个关键字的文件。所以,如果有10个关键词,我会循环文件10次。但是如果文件很大,这种方法效率会非常低。

我听说正确使用哈希可以缓解这种情况,但从未见过一个例子。那么在使用循环一次时,究竟如何使用hash来实现相同的目标呢?你能提供一个例子吗?

1 个答案:

答案 0 :(得分:1)

您有一个解决方案,其时间与文件大小和关键字数量(O(N * K))成正比。您想要一个解决方案,其中所花费的时间不受关键字数量(O(N))的影响。

你确实可以使用哈希来实现这一点。

my @keywords = ...;

my %keywords = map { $_ => 1 } @keywords;
while (<$fh>) {
    my @words = split ' ';                # To be improved.
    if (grep { $keywords{$_} } @words) {  # Replace with foreach loop to exit ASAP.
       ...
    }
}

我使用正则表达式匹配。

my @keywords = ...;

my $pat = join '|', map quotemeta, @keywords;
my $re = qr/$pat/;
while (<$fh>) {
    if (/(?:^|\s)$re(?:\s|\z)/) {  # To be improved.
       ...
    }
}