2009-12-08 2 views
2

У меня есть строка:Как извлечь слова из строки с разделителями-запятыми в Perl?

$myline = 'ca,cb,cc,cd,ce'; 

Мне нужно, чтобы соответствовать ча в $ 1, центибар в $ 2, и т.д ..

К сожалению

$myline =~ /(?:(\w+),?)+/; 

Безразлично Не работай. С pcretest он соответствует только 'ce' в $ 1. Как это сделать правильно? Нужно ли вставлять его в цикл while?

Спасибо!

+0

если слова могут содержать запятые, вы можете использовать модуль CSV, такие как http://search.cpan.org/~makamaka/Text-CSV-1.16/lib/Text/CSV.pm –

ответ

10

Почему бы не использовать split function:

@parts = split(/,/,$myline); 

split разбивает строку в список строк с помощью регулярных выражений вы поставку в качестве разделителя.

9

Непросто в использовании my @parts = split(/,/, $myline)?

+0

Правильно! Самый простой способ - использовать split! –

1

Если количество элементов является переменной, то вы не собираетесь делать это так, как вы стремитесь. Петля через строку, используя глобальный флаг:

while($myline =~ /(\w+)\b/g) { 
    # do something with $1 
}

Я собираюсь предположить, что ваши реальные данные гораздо сложнее, чем «СА, СВ, СС, CD, CE», однако, если это не так, то использование регулярных выражений, вероятно, не является оправданным. Вы бы лучше расколоть строку на ограничительной характер:

my @things = split ',', $myline;
+0

Вы правы. Гораздо лучше использовать раскол в моем случае. Почему бы мне не подумать об этом? –

+0

Потому что это Perl, и есть так много способов сделать это. –

3

Хотя split это хороший способ, чтобы решить вашу проблему, если захватывающая регулярное выражение в контексте списка также работает хорошо. Полезно знать об обоих подходах.

my $line = 'ca,cb,cc,cd,ce'; 
my @words = $line =~ /(\w+)/g; 
+1

Заметным отличием является то, что split будет сохранять пустые записи, давая 'undef' в местах, где запятые являются смежными. Метод regex игнорирует эти места, поскольку они не содержат одного или нескольких символов слова. –

3

Загляни в CSV РМ вы можете загрузить с CPAN, т.е. Text::CSV или Text::CSV_XS.

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

Используя эти модули позволяют легко разделить данные, и разобрать через него ...

Например:

my @field = $csv->fields;