Как я могу добавить новую строку после X количества символов в Perl?

6
задан qdog 30 September 2009 в 21:19
поделиться

9 ответов

Еще более короткий вариант.

$m = "aaaaabbbbbcccccdd";
$m =~ s/(.{1,5})/$1\n/gs;
print $m;

Выводы:

aaaaa
bbbbb
ccccc
dd

Конечно, я думаю, что моя версия - лучшая из всех представленных до сих пор. ;)

9
ответ дан 8 December 2019 в 14:44
поделиться

I heard that the most efficient way is to use unpack:

say for unpack "(A5)*", "012345678901234567890123456879"

Output:

01234
56789
01234
56789
01234
56879
4
ответ дан 8 December 2019 в 14:44
поделиться

Основываясь на ответе Массы, я бы сделал это так:

$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".)

4
ответ дан 8 December 2019 в 14:44
поделиться

В perl есть много способов сделать то же самое; -)

Один из них может быть:

$message = "aaaaabbbbbcccccdd";
$splitmessage = join ("\n",  ( $message =~ /.{1,5}/gs ));
print $splitmessage, "\n";

Вывод:

aaaaa
bbbbb
ccccc
dd
3
ответ дан 8 December 2019 в 14:44
поделиться

Since it appears you're trying to wrap text, I'd look at something like Text::Wrap

0
ответ дан 8 December 2019 в 14:44
поделиться

Метод распаковки, вероятно, самый эффективный, хотя и немного тупой. Метод 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;
0
ответ дан 8 December 2019 в 14:44
поделиться
substr($string, 0, 5);

Соедините это с некоторыми переменными:

$x = 0;
$newstring = '';
while(length($string)<$x){
    $newstring = $newstring + substr($string, $x, ($x+5)) + '\n';
    $x = $x + 5;
}
-1
ответ дан 8 December 2019 в 14:44
поделиться

Просто пропустите вашу строку через это регулярное выражение:

=~ s/([^\n]{5})/$1\n/g

, и все будет в порядке.

Если у вас действительно есть не случайная строка случайных чисел символы, но текст - вы можете вместо этого использовать модуль Text :: Wrap .

-1
ответ дан 8 December 2019 в 14:44
поделиться
echo 123456789abcd|perl -ne'print "$1\n" while s/(^.{5})//;print;'
-2
ответ дан 8 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: