加快正则表达式匹配?

dai*_*isy 3 regex algorithm perl

我正在编写一个日志解析器,逐行读取日志,我有大约100个规则,它的工作原理如下:

if ($line =~ /blabla (field1) (field2)/) 
{ do something } 
else if ($line =~ /something (field1) (field2) else/)
{ do something }
Run Code Online (Sandbox Code Playgroud)

但是对于一个大的日志文件,将一行与这么多规则匹配可能会很慢O(n).

那么,对这个问题有什么建议吗?由于它不仅仅是普通的字符串和通配符匹配,我不知道是否有任何我可以使用的数据结构.

ike*_*ami 7

也许可以使用调度表?

my %handlers = (
   blabla    => \&blabla,
   something => \&something,
);

while (<>) {
   my ($keyword) = $line =~ /^(\S+)/
      or next;

   $handlers{$keyword}
      or next;

   $handlers{$keyword}->($line);
}
Run Code Online (Sandbox Code Playgroud)


And*_*ter 5

我相信你的优化还为时过早.

你试过这个名义上的大日志文件吗?它真的太慢了​​吗?然后,如果它实际上太慢,使用类似devel :: NYTProf一个分析工具,以找出究竟是正在缓慢.