- В чём конкретно трудности На первый взгляд задача несложная , XAnder (ok), 17:04 , 09-Мрт-16 (1) +1
> Вопрос: > каким образом распарсить такого рода таблицу, чтобы на выходе получить Perl хэш вида: В чём конкретно трудности? На первый взгляд задача несложная.
- 1 Ээээ не совсем понятно - получить КОД инициализации хеша, или таки загнать да, Pahanivo (ok), 19:40 , 09-Мрт-16 (2)
1) Ээээ не совсем понятно - получить КОД инициализации хеша, или таки загнать данные в хэш? 2) Зачем использовать хэш для чистого вида двумерного массива??? 3) парсить как то так /^|\s*(\S+)\s*|\s*(\S+)\s*.... возможно палки нужно заэкранить, не помню, далее $1, $2 ..... ну или кромсать построчно в цикле. 4) вот с титулом повеселей, да и вероятно при таком подходе в теле таблицы могут тоже попадаться многостроки ...
- Ну, я бы как-то вот так сказал code usr bin perluse warnings use strict use, ACCA (ok), 01:24 , 10-Мрт-16 (4)
Ну, я бы как-то вот так сказал:
#!/usr/bin/perluse warnings; use strict; use Data::Dumper; my (@row,@header,@result, $i,$hdr); while (<main::DATA>) { s/^\|\s|[\s\|]+\s*$//go; if (/^\+-.+\+$/ && !$hdr .. /^\+-.+\+$/ && $hdr) { if (/^\+/) { if ($hdr) { foreach ($i=0; $i<= $#header; $i++) { $header[$i] = join ' ',@{$header[$i]}; } } $hdr=1; next; } @row = split /\s+\|\s+/,$_; for ($i=0;$i<= $#row;$i++) { push @{$header[$i]},$row[$i] if $row[$i]; } next; } last if /^\+-/; $i={}; @{$i}{@header} = split /\s+\|\s+/,$_; push @result, $i; } print Dumper \@result; __DATA__ +------------------+----------+--------+------+-----+ | Name | Current | Office | Age | ... | | | Position | City | | | +------------------+----------+--------+------+-----+ | Vasiliy_Petrov | student | n/a | 30 | ... | | Petr_Ivanov | worker | MSK | 40 | ... | | Ivan_Ivanov | n/a | SPB | 20 | ... | | ... | ... | ... | ... | ... | +------------------+----------+--------+------+-----+
|