我正在写一些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 ) { .... }
哪个更好?什么时候我们应该使用其中的每一个?
答案 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
。