Я пытаюсь ввести split
строку в ее символы компонента.
Для этой цели я всегда использовал split(//, $str)
как это было предложено the documentation:
Однако это:
print join(':', split(//, 'abc')), "\n";
использует пустая строка соответствует в качестве разделителей для получения выходного сигналаa:b:c
; таким образом, пустую строку можно использовать для разделения EXPR на список его компонентных символов.
В моем сценарии я нужен массив из первых N символов или первые length($str) - 1
символов, в зависимости от того, что меньше. Для этого я использую split(//, $str, $n + 1)
и отбрасываю последний элемент.
В теории это должно сработать. Если LIMIT меньше длины строки, все дополнительные символы сгруппированы в последний элемент, который отбрасывается. Если LIMIT больше длины строки, последний элемент - последний символ, который отбрасывается.
Здесь я столкнулся с проблемой.
В документации сказано:
... и каждый из них:
print join(':', split(//, 'abc', 3)), "\n";
print join(':', split(//, 'abc', 4)), "\n";
производит выходa:b:c
.
Но это не результат, который я получаю. Если LIMIT больше, чем количество символов, результирующий массив всегда заканчивается точно один пустой элемент (demo):
print join(':', split(//, 'abc', 1)), "\n"; # abc
print join(':', split(//, 'abc', 2)), "\n"; # a:bc
print join(':', split(//, 'abc', 3)), "\n"; # a:b:c
print join(':', split(//, 'abc', 4)), "\n"; # a:b:c:
print join(':', split(//, 'abc', 99)), "\n"; # a:b:c:
Эти результаты непосредственно противоречат пример из документации.
Неправильная ли документация? Неверна ли моя версия Perl (v5.22.2)?
Если этого нельзя избежать, как я могу выполнить свою первоначальную цель?
Вы можете в конечном итоге изменить свой пустой шаблон на '/ (?! $) /'. –
Ну, альтернативный способ может быть разделен (//, substr ($ string, 0, $ n)) ' – infixed
Я думаю, что документ просто неверен. Если предел больше длины, следует включить пустую строку после совпадения нулевой ширины в конце. – ysth