В Perl нет пота:
#! /usr/bin/perl
local $_ = "Hattie:07903 000066::Dad:07854 000095::Tom:07903 000044::Allistair:07765 000005::Home:0115 974 0000::";
print "<ol>\n",
map("<li>$_</li>\n", split /::/),
"</ol>\n";
Как используется в вашем вопросе, последовательность ::
является терминатором , а не разделителем, что составляет split
немного концептуального несоответствия.Чтобы более точно подогнать формат, используйте совпадение регулярного выражения в контексте списка с /g
Модификатор /g
задает глобальное сопоставление с образцом, то есть сопоставление как можно больше раз в пределахстрока.Как это ведет себя, зависит от контекста.В контексте списка он возвращает список подстрок, совпадающих с любыми захватывающими скобками в регулярном выражении.
и некожадный квантификатор
По умолчанию количественноsubpattern является «жадным», то есть он будет совпадать столько раз, сколько это возможно (учитывая конкретное начальное местоположение), и в то же время разрешать совпадение с остальной частью шаблона.Если вы хотите, чтобы он совпадал с минимально возможным числом раз, следуйте квантификатору с ?
.Обратите внимание, что значения не меняются, только «жадность»…
Это составляет
print "<ol>\n",
map("<li>$_</li>\n", /(.+?)::/g),
"</ol>\n";
В любом случае, вывод составляет
<ol>
<li>Hattie:07903 000066</li>
<li>Dad:07854 000095</li>
<li>Tom:07903 000044</li>
<li>Allistair:07765 000005</li>
<li>Home:0115 974 0000</li>
</ol>