Самый простой способ разбить строку на равные части в Perl6

Есть ли в Perl6 элегантный способ разбить строку на равные части, как, например, это реализовано в PowerShell? В PowerShell:

'abcdefghijklmnopqrstuvwxyz' -split '(.{8})'

Результат:

abcdefgh
ijklmnop
qrstuvwx
yz

Есть много глупых split в официальной документации Perl6 и нет ни одного простого и эффективного. Предложения?

1 ответ

Решение

Это не было бы в документах для .split потому что это так .comb ты ищешь.

.say for 'abcdefghijklmnopqrstuvwxyz'.comb: 8
abcdefgh
ijklmnop
qrstuvwx
yz

Он также используется для сопоставления частей строки с помощью регулярного выражения

.say for 'abcdefg4444hijklmnop4444qrstuvwxyz'.comb: /..\d+../
fg4444hi
op4444qr

Вы можете посмотреть на .comb(Int) Форма в качестве ярлыка для регулярного выражения, которое соответствует до этого количества символов

.say for 'abcdefghijklmnopqrstuvwxyz'.comb: / . ** 1..8 /
abcdefgh
ijklmnop
qrstuvwx
yz

Технически вы можете использовать .split, но обычно используется для удаления символов разделения. Когда вы просите его сохранить их, он возвращает объект Match для символов разделения.

.say for 'abcdefghijklmnopqrstuvwxyz'.split( /. ** 1..8/, :v, :skip-empty )

(Поскольку регулярное выражение соответствует тому, что мы ищем, :skip-empty используется для удаления пустых несогласованных строк между ними.)

「abcdefgh」
「ijklmnop」
「qrstuvwx」
「yz」

Это также можно сделать с помощью :global / :g опция для регулярного выражения, но она также возвращает объекты Match.

.say for 'abcdefghijklmnopqrstuvwxyz' ~~ m :global / . ** 1..8/
「abcdefgh」
「ijklmnop」
「qrstuvwx」
「yz」
Другие вопросы по тегам