Еще более короткий вариант.
$m = "aaaaabbbbbcccccdd";
$m =~ s/(.{1,5})/$1\n/gs;
print $m;
Выводы:
aaaaa
bbbbb
ccccc
dd
Конечно, я думаю, что моя версия - лучшая из всех представленных до сих пор. ;)
I heard that the most efficient way is to use unpack:
say for unpack "(A5)*", "012345678901234567890123456879"
Output:
01234
56789
01234
56789
01234
56879
Основываясь на ответе Массы, я бы сделал это так:
$message = join("\n", unpack('(A5)*', $message ))
запустив его,
$ perl
use strict;
use warnings;
my $message = "aaaaabbbbbcccccdd";
$message = join("\n", unpack("(A5)*", $message));
print $message;
^D
aaaaa
bbbbb
ccccc
dd
Замени "\ n" на то, чем вы хотите фактически завершить каждую строку (например, "\
\ n".)
В perl есть много способов сделать то же самое; -)
Один из них может быть:
$message = "aaaaabbbbbcccccdd";
$splitmessage = join ("\n", ( $message =~ /.{1,5}/gs ));
print $splitmessage, "\n";
Вывод:
aaaaa
bbbbb
ccccc
dd
Since it appears you're trying to wrap text, I'd look at something like Text::Wrap
Метод распаковки, вероятно, самый эффективный, хотя и немного тупой. Метод regex, вероятно, является наиболее подходящим для Perlish способом. Но поскольку это Perl, есть несколько способов сделать это, поэтому вот еще несколько забавных способов сделать это:
с помощью List :: MoreUtils :: natatime
("n- вовремя"). Этот метод, конечно же, сильно расточит память, создавая скаляр для каждого символа в строке.
use List::MoreUtils qw(natatime);
my $in = "aaaaabbbbbcccccdd";
my $out = '';
my $it = natatime 5, split //, $in;
while(my @chars = $it->()) {
$out .= $_ for @chars;
$out .= "\n";
}
с использованием аргумента «замена» substr
для вставки новой строки, работая с конца: (у вас есть работать с конца, потому что в противном случае дальнейшие смещения больше не будут выстраиваться после того, как вы начнете добавлять новые строки; также работа с конца означает, что вы вычисляете только length $ in
во время начала цикла без использования дополнительной переменной)
for(my $i = length($in) - length($in) % 5; $i; $i -= 5) {
substr($in, $i, 0, "\n");
}
, если вы хотите оставить входную переменную как есть, вы можете предварительно вычислить все смещения и извлеките их с помощью substr
foreach (map $_ * 5, 0 .. int(length($in) / 5)) {
$out .= substr($in, $_, 5) . "\n";
}
, вероятно, наиболее кратким способом использования substr
является использование замены и конкатенации возвращаемого значения:
$out .= substr($in, 0, 5, '') . "\n" while $in;
substr($string, 0, 5);
Соедините это с некоторыми переменными:
$x = 0;
$newstring = '';
while(length($string)<$x){
$newstring = $newstring + substr($string, $x, ($x+5)) + '\n';
$x = $x + 5;
}
Просто пропустите вашу строку через это регулярное выражение:
=~ s/([^\n]{5})/$1\n/g
, и все будет в порядке.
Если у вас действительно есть не случайная строка случайных чисел символы, но текст - вы можете вместо этого использовать модуль Text :: Wrap .
echo 123456789abcd|perl -ne'print "$1\n" while s/(^.{5})//;print;'