Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хеш хешей + строка. 
:(
    Опции темы
dixoNICH
Дата 12.5.2011, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



На входе строка $str, примерно такого вида
Код

$str = "Number : 2
Octets : 84947
Subject: ыфоыофыофоы
Date : Mon, 2 May 2011 22:30:48 +0600
From : Nikita  <[email protected]>
Message :
 ыфыфыфыфы
Number : 3
Octets : 79186
Subject: From
Date : Mon, 18 Apr 2011 23:39:02 +0600

From : Max Panachev <[email protected]>

Message :
 HELLO, DUDE!!" 

и из неё надо получить хеш хешей вида :
Код

%hash = ( 
        "message1"=> {"subject"=>"hello world", "from"=>"nikitka", "date" => "12.01.12", "Message" => "privet", "Octets" => 1234}, 
        "message2"=> {"subject"=>"yo!", "from"=>"sasha", "date" => "31.01.12", "Message" => "ooh", "Octets" => 154}, 
        );

не подскажете, как мне это осуществить?
PM MAIL   Вверх
arto
Дата 12.5.2011, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



невозможно.
у вас данные не совпадают
PM MAIL ICQ   Вверх
od0201
Дата 13.5.2011, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 16.1.2009

Репутация: 1
Всего: 1



Код

# =b= - ограничиваем блоки, =p= - ограничиваем поля в блоках
$str=~s/(Number :)/=p==b=$1/g;
$str=~s/([A-z]+ *:)/=p=$1/g;
$str.='=p==b=';
while ($str=~/Number : (\d+)(.*?)=b=/gsi){
    ($n,$h)=($1,$2);
    while ($h=~/([A-z]+) *:(.*?)=p=/gsi){    $hash{$n}{$1}=$2;    }
}

PM MAIL   Вверх
arto
Дата 13.5.2011, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



сложно.

perl -0777 -nle 'my %h = grep !/^$/, split "Number\\s+:\\s+(\\d+)"; foreach (values %h) { $_ = { map { split "\\s*:\\s*",$_,2 } split "\\n(?!\\s+)",$_ } }'
PM MAIL ICQ   Вверх
dixoNICH
Дата 13.5.2011, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



спасибо вам.
Код

my %h = grep !/^$/, split "Number\\s+:\\s+(\\d+)"; foreach (values %h) { $_ = { map { split "\\s*:\\s*",$_,2 } split "\\n(?!\\s+)",$_ }}
my %h = grep !/^$/, split "Octets\\s+:\\s+(\\d+)"; foreach (values %h) { $_ = { map { split "\\s*:\\s*",$_,2 } split "\\n(?!\\s+)",$_ }}
print keys %h;

а почему так не работает?
и ещё, почему-то не смог поэлементно вывести 
message1, Number, 1
message2, Number, 2



Это сообщение отредактировал(а) dixoNICH - 13.5.2011, 20:16
PM MAIL   Вверх
arto
Дата 13.5.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



у меня работает

# perl -MData::Dumper -0777 -nle 'my %h = grep !/^$/, split "Number\\s+:\\s+(\\d+)"; foreach (values %h) { $_ = { map { split "\\s*:\\s*",$_,2 } split "\\n(?!\\s+)",$_ } } print Dumper \%h'
Number : 2
Octets : 84947
Subject: ыфоыофыофоы
Date : Mon, 2 May 2011 22:30:48 +0600
From : Nikita  <[email protected]>
Message :
 ыфыфыфыфы
Number : 3
Octets : 79186
Subject: From
Date : Mon, 18 Apr 2011 23:39:02 +0600
From : Max Panachev <[email protected]>
Message :
 HELLO, DUDE!!
^D
$VAR1 = {
          '3' => {
                   'Octets' => '79186',
                   'Subject' => 'From',
                   'Message' => 'HELLO, DUDE!!',
                   'Date' => 'Mon, 18 Apr 2011 23:39:02 +0600',
                   'From' => 'Max Panachev <[email protected]>'
                 },
          '2' => {
                   'Octets' => '84947',
                   'Subject' => 'ыфоыофыофоы',
                   'Message' => 'ыфыфыфыфы',
                   'Date' => 'Mon, 2 May 2011 22:30:48 +0600',
                   'From' => 'Nikita  <[email protected]>'
                 }
        };
#
PM MAIL ICQ   Вверх
dixoNICH
Дата 14.5.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



да, работает
огромное спасибо!
PM MAIL   Вверх
dixoNICH
Дата 16.5.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



а ещё не подскажете, как мне засунуть в хеш такое

Message : hello world!
dasdsa
sad;a
> sasakska
>sklaskaska
>skaksak

чтобы было что-то вида 
%hash = ( 
        "message1"=> {"subject"=>"hello world", "from"=>"nikitka", "date" => "12.01.12", "Message" => "hello world!\ndasdsa\n> sasakska\n>sklaskaska\n>skaksak ", "Octets" => 1234}, 
        );
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.