Perl:字符串索引函数或正则表达式 - 哪个更好,什么时候?

时间:2015-06-09 23:09:09

标签: regex perl

我正在写一些Perl脚本,我需要做很多字符串匹配。 例如:

  CASE WHEN t.desired_shape = 'fade' 
         THEN 1
       WHEN t.desired_shape IS NULL
         THEN NULL
       ELSE 0
  END

要查看$ str1是否包含$ str2 - 我发现有两种方法:

方法1: 使用索引功能:

my $str1 = "this is a test string";
my $str2 = "test";

方法2: 使用正则表达式:

if ( index($str1, $str2) != -1 ) { .... }

哪个更好?什么时候我们应该使用其中的每一个?

3 个答案:

答案 0 :(得分:6)

以下是Benchmark的结果:

use Benchmark qw(:all) ;
my $count = -1;
my $str1 = "this is a test string";
my $str2 = "test";
my $str3 = qr/test/;

cmpthese($count, {
    'type1' => sub { if ( index($str1, $str2) != -1 ) { 1 } },
    'type2' => sub { if( $str1 =~ $str3 ) { 1 } },
});

结果(匹配发生时):

           Rate type2 type1
type2 1747627/s    --  -70%
type1 5770465/s  230%    --

为了得出结论,请测试以匹配:

my $str2 = "text";
my $str3 = qr/text/;

结果(未匹配时):

           Rate type2 type1
type2 1857295/s    --  -67%
type1 5560630/s  199%    --

<强>结论:

index函数比正则表达式匹配快得多。

答案 1 :(得分:2)

当我看到使用index的代码时,我通常会在index内的index内看到index,等等。 :&#34;如果找到,请查找 this ;否则因为找不到,请找那个。&#34;几乎总是一个正则表达式会起作用。所以,对我来说,我几乎总是使用正则表达式,除非我有一些特殊原因要使用index

不幸的是,我遇到的大多数程序员都没有很好地阅读正则表达式,因此为了可维护性,index方法应该比我更多地使用。

答案 2 :(得分:0)

如果您需要子字符串匹配,请使用index。如果需要正则表达式匹配(对于regexp元字符具有特殊含义),请使用=~。子串匹配通常更快,但Perl中的正则表达式得到了很好的优化,简单的正则表达式匹配可以非常快。为自己进行基准测试。

为了获得最佳的regexp性能,您可能需要确保Perl不会多次编译正则表达式:$str =~ /$str2/o