Учитывая две строковые переменные $string и $needle в perl, какой наиболее эффективный способ проверить, начинается ли $string с $needle.
-
$string =~ /^\Q$needle\E/- это самое близкое совпадение, которое я мог бы думать о том, что делает то, что требуется, но является наименее эффективным (безусловно) решением, которое я пробовал. -
index($string, $needle) == 0работает и относительно эффективен для некоторых значений$stringи$needle, но бесполезно ищет иглу в других позициях (если не найден в начале). -
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() работает лучше, чем substr()+eq с этой системой с perl 5.14.2, но с:
string="aaaaabaaaaabaaaaabaaaaabaaaaabaaaaab" needle="aaaaaa"
Это изменилось.