Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Помогите решить задачу с матрицей!


Автор: Suppir 14.10.2010, 11:42
Добрый день! 

Есть следующая матрица в файле 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


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




Автор: Suppir 14.10.2010, 14:05
Эту задачу решил следующим кодом:

Код

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 не получилось присваивать с случае с пустым значением.

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

Код

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

=>
Код

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

Автор: arto 14.10.2010, 21:12
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; }'

Автор: Suppir 16.10.2010, 19:25
arto, можете пояснить, как работает


@h{@a}

и 

$hash{ $n } = \%h

?

Автор: arto 17.10.2010, 17:23
1. perldoc perldata на предмет slice
2. perldoc perlref

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



что бы понять что пишет arto надо уметь пользоваться http://perldoc.perl.org/B/Deparse.html, 
хотя может и не помочь smile 

Автор: tishaishii 27.10.2010, 22:56
Код
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
    }
}

Автор: Sugar84 28.10.2010, 16:30
Цитата(ming @ 14.10.2010,  15:53)
Код

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

В случае нуля на 99 заменится же, разве не?

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

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

Автор: tishaishii 29.10.2010, 22:42
Замечательно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)