处理多行输入 - Loop vs Regex

时间:2013-08-12 07:08:27

标签: regex performance perl

我正在尝试在这样的多行输入字符串中查找特定关键字,

this is input line 1
this is the keyword line
this is another input line
this is the last input line

多行输入存储在名为“$ inputData”的变量中。现在,我有两种方法可以找到“关键字”这个词,

方法1:
使用split将行放入使用“\ n”分隔符的数组中,并使用foreach循环迭代并处理每一行,如下所示,

my @opLines = split("\n", $inputData);

# process each line individually
foreach my $opLine ( @opLines )
{
    # look for presence of "keyword" in the line
    if(index($opLine, "keyword") > -1)
    {
        # further processing
    }
}


方法2:
使用正则表达式,如下所示,

if($inputData =~ /keyword/m)
{
    # further processing
}


我想知道这两种方法如何相互比较,对于实际的代码性能和执行时间,什么是更好的方法。此外,还有更好,更有效的方法来完成这项任务吗?

1 个答案:

答案 0 :(得分:2)

my @opLines = split("\n", $inputData);

将创建变量@opLines,分配内存,并通过整个"\n"搜索$inputData并将找到的行写入其中。

# process each line individually
foreach my $opLine ( @opLines )
{

将为数组@opLines

中的每个值处理整堆代码
    # look for presence of "keyword" in the line
    if(index($opLine, "keyword") > -1)

将在每行中搜索"keyword"

    {
        # further processing
    }
}

和comapare

if($inputData =~ /keyword/m)

将搜索"keyword"并在第一次出现时停止。

{
    # further processing
}

现在猜测,什么会更快,消耗更少的内存(也会影响速度)。如果你不好猜测使用Benchmark模块。

根据documentation m正则表达式修饰符:将字符串视为多行。也就是说,改变“^”和“$”来匹配字符串左端和右端的行的开头或结尾,以匹配字符串中的任何位置。我没有看到{{1你的正则表达式中也没有^所以它在那里没用。