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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите решить задачу с матрицей! Двумерную матрицу => в хеш хешей 
:(
    Опции темы
Suppir
Дата 14.10.2010, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день! 

Есть следующая матрица в файле File.txt:


    A    B    C    D
Иванов    3    6    6    
Петров    5        7    7
Дурнов    2    3    3    3
Кошкин    8        1    1


Верхняя строка представляет собой название АТРИБУТА. Левый столбец обозначает человека.
Все данные разделены табами. В начале первой строки тоже стоит таб. 


Необходимо создать структуру вида:

$hash{Иванов}{A}=3
$hash{Иванов}{B}=6
$hash{Иванов}{С}=6
$hash{Иванов}{D}=99 // на пересечении Иванов и D нет никакого значения, в таких случаях присваиваем 99
$hash{Петров}{A}=5
$hash{Петров}{B}=99
$hash{Петров}{С}=7
$hash{Петров}{D}=7
$hash{Дурнов}{A}=2
$hash{Дурнов}{B}=3
$hash{Дурнов}{C}=3
$hash{Дурнов}{D}=3
$hash{Кошкин}{A}=8
$hash{Кошкин}{B}=99
$hash{Кошкин}{C}=1
$hash{Кошкин}{D}=1


Заранее спасибо решившему!




PM MAIL   Вверх
Suppir
Дата 14.10.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Эту задачу решил следующим кодом:

Код

open(TABLE, "table.txt");
while(<TABLE>){
    if (/^[;\/]/){next}
    unless (defined @types){@types = split /\t/; shift @types; next}
    if (@lines = split /\t/){
        @typesCopy = @types;
        my $source = lc(shift(@lines));
        foreach my $value(@lines){
            my $type = lc(shift(@typesCopy));
            $priority{$source}{$type} = $value;
        }
        
    }
}


Добавлено через 33 секунды
Только 99 не получилось присваивать с случае с пустым значением.
PM MAIL   Вверх
ming
Дата 14.10.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

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



Цитата(Suppir @  14.10.2010,  18:05 Найти цитируемый пост)
Только 99 не получилось присваивать с случае с пустым значением.

Код

$priority{$source}{$type} = $value;

=>
Код

$priority{$source}{$type} = $value ? $value : '99';

PM MAIL ICQ Jabber   Вверх
arto
Дата 14.10.2010, 21:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



perl -lne 'if (m#^\s+#) { (undef,@a) = split "\t" } else { my ($n,@b) = split "\t"; my %h; @h{@a} = map { $_ || 99 } @b; $hash{ $n } = \%h; }'
PM MAIL ICQ   Вверх
Suppir
Дата 16.10.2010, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



arto, можете пояснить, как работает


@h{@a}

и 

$hash{ $n } = \%h

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


Эксперт
***


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

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



1. perldoc perldata на предмет slice
2. perldoc perlref
PM MAIL ICQ   Вверх
ElectricalStorm
Дата 26.10.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Suppir @ 16.10.2010,  19:25)
arto, можете пояснить, как работает



что бы понять что пишет arto надо уметь пользоваться Deparse
хотя может и не помочь smile 


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
tishaishii
Дата 27.10.2010, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Код
perl -MData::Dumper
`cat File.txt`=~m{
\t(A)\t(B)\t(C)\t(D)\n
(Иванов)\t(3)\t(6)\t(6)\t\n
(Петров)\t(5)\t\t(7)\t(7)\n
(Дурнов)\t(2)\t(3)\t(3)\t(3)\n
(Кошкин)\t(8)\t\t(1)\t(1)
}xois and print Dumper {
    $5=>{
        $1=>$6,
        $2=>$7,
        $3=>$8,
        $4=>99
    },
    $9=>{
        $1=>$10,
        $2=>99,
        $3=>$11,
        $4=>$12
    },
    $13=>{
        $1=>$14,
        $2=>$15,
        $3=>$16,
        $4=>$17
    },
    $18=>{
        $1=>$19,
        $2=>99,
        $3=>$20,
        $4=>$21
    }
}


Это сообщение отредактировал(а) tishaishii - 27.10.2010, 23:01
PM MAIL ICQ Skype   Вверх
Sugar84
Дата 28.10.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ming @ 14.10.2010,  15:53)
Код

$priority{$source}{$type} = $value ? $value : '99';

В случае нуля на 99 заменится же, разве не?
PM MAIL   Вверх
ming
Дата 28.10.2010, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

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



Цитата(Sugar84 @  28.10.2010,  20:30 Найти цитируемый пост)
В случае нуля на 99 заменится же, разве не?

Верно, заменится. 
Тогда, если значение '0' или 0 допустимо, то 
Код
$priority{$source}{$type} = defined $value ? $value : '99';

PM MAIL ICQ Jabber   Вверх
tishaishii
Дата 29.10.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Замечательно.

Это сообщение отредактировал(а) tishaishii - 29.10.2010, 22:44
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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