【发布时间】:2015-06-09 23:09:08
【问题描述】:
我正在编写一些需要进行大量字符串匹配的 Perl 脚本。 例如:
my $str1 = "this is a test string";
my $str2 = "test";
查看 $str1 是否包含 $str2 - 我发现有两种方法:
方法一: 使用索引函数:
if ( index($str1, $str2) != -1 ) { .... }
方法 2: 使用正则表达式:
if( $str1 =~ /$str2/ ) { .... }
哪个更好?我们什么时候应该使用它们中的每一个?
【问题讨论】:
-
为简单起见,我们假设字符串不包含正则表达式元字符(与我的用例一样)。这种情况下的答案是什么?
-
您通常不会在字符串中的 anywhere 中寻找匹配项。在您的示例中,您可能希望
this is a test string匹配,但您可能不想匹配I am a Protestant。事实上,在任何地方寻找匹配项(无论是index还是未锚定的正则表达式)是一个常见的逻辑错误。 -
我认为正则表达式会尝试优化表达式中第一个字母的位置。两种方式都可能更快,更好地进行基准测试。而且我认为正则表达式允许您从上一场比赛停止的地方继续寻找下一场比赛。但是,它可能是 index 允许您设置起始位置(不记得)。
-
index($str1, $str2) != -1的等价物其实是$str1 =~ /\Q$str2/