Подтвердить что ты не робот

Perl разделяется с пустым текстом до/после разделителей

Я замечал какое-то любопытное поведение с командой разделения Perl, особенно в тех случаях, когда я ожидал, что результирующий массив будет содержать пустые строки '', но на самом деле этого не делает.

Например, если у меня есть разделитель в конце (или начале) строки, результирующий массив не имеет пустую строку (s) '' в качестве последнего (или первого) элемента.

Пример:

@s = split(/x/, 'axb')

создает 2 элемента массива ['a', 'b']

@s = split(/x/, 'axbx')

создает тот же массив

@s = split(/x/, 'axbxxxx')

создает тот же массив

Но как только я положил что-то в конец, все эти пустые строки выглядят как элементы:

@s = split(/x/, 'axbxxxxc')

создает массив из 6 элементов ['a', 'b', '', '', '', 'c']

Поведение аналогично, если разделители находятся в начале.

Я ожидал бы пустой текст между, до или после разделителей, чтобы всегда создавать элементы в расколе. Может ли кто-нибудь объяснить мне, почему раскол ведет себя так, как в Perl? Я просто пробовал то же самое в Python, и он работал, как ожидалось.

Примечание: Perl v5.8

4b9b3361

Ответ 1

Из документация:

По умолчанию пустые начальные поля сохраняются, а пустые конечные удаляются. (Если все поля пустые, они считаются завершающими.)

Это объясняет поведение, которое вы видите с завершающими полями. Это, как правило, имеет смысл, так как люди часто очень небрежны относительно конечных пробелов, например. Однако вы можете получить конечные пустые поля, если хотите:

split /PATTERN/,EXPR,LIMIT

Если LIMIT отрицательный, он обрабатывается так, как если бы был задан произвольно большой LIMIT.

Итак, чтобы получить все конечные пустые поля:

@s = split(/x/, 'axbxxxxc', -1);

(Я предполагаю, что вы сделали неосторожную ошибку, глядя на ведущие пустые поля - они определенно сохранены. Попробуйте split(/x/, 'xaxbxxxx'). Результат имеет размер 3.)