Perl разделен с пустым текстом до / после разделителей - PullRequest
23 голосов
/ 14 сентября 2010

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

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

Пример:

@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

1 Ответ

46 голосов
/ 14 сентября 2010

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

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

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

split /PATTERN/,EXPR,LIMIT

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...