在perl
中,给定两个字符串变量$string
和$needle
,最有效的方法是什么来检查$string
是否以$needle
开头。
$string =~ /^\Q$needle\E/
是我能想到的最接近完成所需功能但效率最低(远低于其他尝试的解决方案)的匹配。index($string, $needle) == 0
可以工作并且相对高效一些,但在其他位置不必要地搜索针(如果未在开头找到)。substr($string, 0, length($needle)) eq $needle
应该很简单且高效,但在我的几次测试中大多数情况下都不比前一个更高效。
在perl
中是否有通用的方式可以实现此操作,而我不知道或者有没有优化上述任何一种解决方案的方法?
(在我的特定用例中,$string
和$needle
每次运行都会不同,因此无法预编译正则表达式)。
如何测量给定解决方案的性能的示例(在这里使用POSIX sh
):
string='somewhat not so longish string' needle='somew'
time perl -e '
($n,$string,$needle) = @ARGV;
for ($i=0;$i<$n;$i++) {
index($string, $needle) == 0
}' 10000000 "$string" "$needle"
使用这些值,index()
在此系统中使用 perl 5.14.2 比 substr()+eq
表现更好,但在以下情况下:
string="aaaaabaaaaabaaaaabaaaaabaaaaabaaaaab" needle="aaaaaa"
那是反过来的。
String::MoreUtils::XS
? - pilcrow/usr/bin/time
,因为它可能无法提供公正的比较。 - ThisSuitIsBlackNot