Самый простой способ разбить строку на равные части в 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」