Учитывая две строковые переменные $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"
Это изменилось.