PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 64



56    Глава 1 • Строки

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

Решение

Воспользуйтесь следующей процедурой:

sub parse_csv {

my $text = shift;    # Запись со значениями, разделенными запятыми

my @new = ();

push(@new, $+) while $text =~ m{

# Первая часть группирует фразу в кавычках

I , }gx;

push(@new, undef) if substr($text, -1,1) eq ','; return @new,    # Список значений, которые разделялись запятыми }

Также можно воспользоваться стандартным модулем Text: Parse Words:

use Text:.ParseWords,

sub parse_csv {

return quoteword( ',' ,0,   $_[0], }

Комментарий

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

К счастью, модуль Text::ParseWords скрывает от вас все сложности. Передайте функции qoutewords два аргумента и строку разделенных данных. Первый аргу­мент определяет символ-разделитель (в данном случае — запятая), а второй — ло­гический флаг, который показывает, должна ли возвращаемая строка содержать внутренние кавычки.

Если кавычки должны присутствовать внутри поля, также ограниченного кавыч­ками, воспользуйтесь префиксом \: "like \"this\". Кавычки, апострофы и обрат­ная косая черта — единственные символы, для которых этот префикс имеет спе­циальное значение. Все остальные экземпляры \ остаются в итоговой строке.

Ниже показан пример использования процедуры parse_csv. q<> — всего лишь хитроумный заменитель кавычек, благодаря которому нам не придется расстав­лять повсюду символы \.

$line = q<XYZZY,   ""/O'Reilly,   Inc'/'Wall,   LarryVa \"glug\"  bit,", 5,


1.16. Сравнение слов с похожим звучанием    57

"Error,   Core Dumped">, ©fields = parse_csv($line), for ($1 = 0,$i < ©fields;   $i++)




Начало  Назад  Вперед



Книжный магазин