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

如何在perl中使用哈希来减少循环的使用?,perl,loops,hash,Perl,Loops,Hash,例如,首先,我确定了几个关键词。然后,在另一个文件中,我想找到与这些关键字完全匹配的行 使用loop,我将循环遍历每个关键字的文件。因此,如果有10个关键字,我将循环文件10次。但是,如果文件很大,这种方法将非常耗时 我听说适当使用散列可以缓解这种情况,但从未见过一个例子。那么,究竟如何使用哈希实现相同的目标,而只使用一次循环呢?你能举个例子吗?你有一个解决方案,它所用的时间与文件的大小和关键字的数量成正比(O(N*K))。您想要的解决方案是,所用的时间不受关键字数量(O(N))的影响 您确实可

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

使用loop,我将循环遍历每个关键字的文件。因此,如果有10个关键字,我将循环文件10次。但是,如果文件很大,这种方法将非常耗时


我听说适当使用散列可以缓解这种情况,但从未见过一个例子。那么,究竟如何使用哈希实现相同的目标,而只使用一次循环呢?你能举个例子吗?

你有一个解决方案,它所用的时间与文件的大小和关键字的数量成正比(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=。。。;
我的%keywords=map{$\=>1}@keywords;
而(){
我的@words=split''#有待改进。
如果(grep{$keywords{${}}@words){#替换为foreach循环以尽快退出。
...
}
}
我会用正则表达式匹配

my @keywords = ...;

my $pat = join '|', map quotemeta, @keywords;
my $re = qr/$pat/;
while (<$fh>) {
    if (/(?:^|\s)$re(?:\s|\z)/) {  # To be improved.
       ...
    }
}
my@keywords=。。。;
我的$pat=join'|',map quotemeta,@keywords;
我的$re=qr/$pat/;
而(){
如果(/(?:^|\s)$re(?:\s |\z)/{#需要改进。
...
}
}