Perl: вставьте "\ n" каждые 70 символов - PullRequest
1 голос
/ 22 сентября 2019

У меня следующая проблема.У меня длинная строка (более 1 тысячи символов), и я должен вставлять «\ n» каждые 70 символов.Моя идея была

my $finalstr;
    for($i=0; $i<=length($input)+1; $i=$i+70){
    $finalstr.=$finalstr.substr($input,$i,3)."\n";
    }

Но, похоже, это не сработало. Проблема в том, что я не знаю, как использовать регулярное выражение в этом случае, потому что число символов в $input не может бытькратный 70.

Ответы [ 2 ]

4 голосов
/ 22 сентября 2019

Рассмотрим:

$finalstr =~ s/(.{70})/$1\n/gs;

Выражение (.{70}) захватывает 70 символов, а затем $1\n заменяет захваченную часть, за которой следует новая строка.Модификатор g делает поиск глобальным (каждое совпадение заменяется).

Примечание. Если в строке нет встроенных новых строк, вы можете удалить окончательные s.

Пример (с 4 символами вместо 70):

$ perl -we 'my $finalstr = "123456789"; $finalstr =~ s/(.{4})/$1\n/gs; print "$finalstr\n";'
1234
5678
9
$

Редактировать

Как прокомментировано ikegami , альтернативное решение будетбыть:

$finalstr =~ s/.{70}\K/\n/g;

Обоснование:

  • класс символов \K указывает, что то, что от него осталось, не должно подавляться;следовательно, захват не требуется (это более эффективно, чем захват и замена)

  • удаление модификатора s позволяет избежать подсчета в новых строках как символов при сопоставлении;таким образом, если в строку будет вставлена ​​новая строка, следующая строка будет принимать 70 символов вместо только остатка предыдущей строки.

2 голосов
/ 23 сентября 2019

Две проблемы: при вызове substr вы указываете значение 3. Это, очевидно, должно быть 70. Затем вы соединяетесь с целевой строкой дважды , сначала используя .=, а затемповторяя $finalstr.Вам нужно использовать либо один, а не оба.

Исправление, которое дает вам

for($i=0; $i<=length($input)+1; $i=$i+70){
    $finalstr .= substr($input,$i,70)."\n";
}

, который работает, как вы предполагали.substr также может действовать как lvalue, поэтому, если вы не возражаете против изменения $input, вы можете использовать эту форму:

for($i=70; $i<=length($input)+1; $i=$i+71){
    substr($input,$i,0) = "\n"; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...