LINUX.ORG.RU

разбор строки на Perl


0

0

Всем привет.
Подскажите, пожалуйста, как на Perl разобрать
строку вида:
abc,"def","g,h,i",j k l,'mno'
в массив:
['abc', 'def', 'g,h,i', 'j k l', 'mno']
сколько голову не ломал, нормального решения не придумал.
Заранее спасибо.

#!/usr/bin/perl

$s = 'abc,"def","g,h,i",j k l,\'mno\'';
print "$s\n";
@m=();
while($s) {
last unless $s =~ s/((\"?).*?\2),(.*)/\3/;
push @m, $1;
}
push @m, $s;
print "[" . join(", ", @m) . "]\n";

KtaK ★★
()
Ответ на: комментарий от KtaK

Во, спасибо.
Правда единственный глюк, который может возникнуть,
это когда будет разбираться строка:
asd,asd,asd,"asd,asd"
Последний параметр в кавычках разобъется на 2:
"asd и asd"

Reinventer
() автор топика
Ответ на: комментарий от Reinventer

Тогда, может так:

#!/usr/bin/perl

#$s = 'abc,"def","g,h,i",j k l,\'mno\'';
$s = 'asd,asd,asd,"asd, asd"';
print "$s\n";
@m=();
while($s) {
last unless $s =~ s/((\"?).*?\2),(.*)/\3/;
$ret = $1;
if ($ret =~ /^\".*[^\"]$/) {
$s = "$ret,$s";
last;
}
push @m, $ret;
}
push @m, $s;
print "[" . join(" | ", @m) . "]\n";

KtaK ★★
()
Ответ на: комментарий от anonymous

Спасибо за ответы.
Модуль посмотрю, но боюсь слишком жирно будет отдельный
модуль ставить для моей задачи.

Вот окончательный вариант, который у меня получился
(поддерживает одинарные и двойные кавычки, убирает
пробелы вокруг запятых):

#!/usr/bin/perl -w

#$s = 'abc," def","g,h,i",j k l,\'mno\'';
$s = 'asd , asd , \'asd \' ," asd,asd"';
print "$s\n";
@m=();
while($s) {
last unless $s =~ s/^\s*(["']?)(.*?)\1\s*(,|$)//;
push @m, $2;
}
print "[" . join("|", @m) . "]\n";

Reinventer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.