Преобразование многострочной строки в массив

Как преобразовать многострочную строку в массив?

my $text= " ads da
sda
s 
da
d
as

das
d a as dasd
\n

";

Примечание: я не хочу удалять или удалять новую строку?

5 ответов

Решение

Вы можете разделить начало строк, используя ^ метасимвол и тому m модификатор регулярного выражения ^ соответствовать началу строки, а не только началу строки):

split /^/m, $text

На самом деле, вы можете оставить m поскольку split вставляет это для вас в этом случае. От perldoc -f split: "ШАБЛОН"/^/"обрабатывается так, как если бы он был"/^/m", так как в противном случае он мало используется".

Используя ваше значение для $text, этот код:

use Data::Dumper;
$Data::Dumper::Useqq=1;
print Data::Dumper->Dump([[split /^/, $text]], ["*text"]);

Печатает это:

@text = (
          " ads da\n",
          "sda\n",
          "s \n",
          "da\n",
          "d\n",
          "as\n",
          "\n",
          "das\n",
          "d a as dasd\n",
          "\n",
          "\n",
          "\n"
        );

В нынешнем виде вопрос можно сформулировать более четко.

my @text = split "\n", $text;

Имея в виду, что первый аргумент split это шаблон:

#!/usr/bin/perl

use strict; use warnings;
use YAML;

my $text = " ads da
sda
s
da
d
as

das
d a as dasd
\n

";

print Dump [ split /(\n)/, $text ];

Выход:

---
- "объявления да"
- "\n"
- Сда
- "\n"
- с
- "\n"
- да
- "\n"
- г
- "\n"
- как
- "\n"
- ''
- "\n"
- дас
- "\n"
- да как дасд
- "\n"
- ''
- "\n"
- ''
- "\n"
- ''
- "\n"

Мне было весело собрать это вместе: Вуаля! Ваша строка теперь является массивом без split это

use strict qw<subs vars>;
use warnings;

@{" ads da
sda
s 
da
d
as

das
d a as dasd
\n
"} = 1..3
;

Я чувствую, что вы сосредоточены на неправильной проблеме.

Вместо того, чтобы пытаться преобразовать скалярную многострочную строковую константу в список, возможно, ваш вопрос должен звучать так: "Как мне запустить многострочную строку в списке или массиве Perl?"

Посмотрите на конструкторы значений списка Perl в Perldata.

Особая применимость к вашему вопросу заключается в том, как использовать heredoc для запуска массива с многострочной строкой:

#!/usr/bin/perl
use strict; use warnings;
use YAML;

my @text= <<END =~ m/(^.*\n)/mg;
 ads da
sda
s 
da
d
as

das
d a as dasd
\n

END

print Dump \@text;

Печать:

---
- " ads da\n"
- "sda\n"
- "s \n"
- "da\n"
- "d\n"
- "as\n"
- "\n"
- "das\n"
- "d a as dasd\n"
- "\n"
- "\n"
- "\n"

Используйте идиомы Люк!

Другие вопросы по тегам