2016-05-18 3 views
1

Извините за плохой английскийКак читать каждые 3 строки в perl?

У меня есть TXT-файл, как это:

id: 1 
name: a 
sex: m 
id: 2 
name: b 
sex: f 

, так что я хотел бы прочитать каждые 3 строки этого файла в массив

[ { id =>1, name => a, sex => m }, { id=>2, name=>b, sex=>f}] 

Как читать каждые 3 строки в perl?

+0

Вы можете прочитать его по строке и разделить на «:», когда первая часть «id» хранит предыдущую хеш-ссылку в вашем массиве, и вы начинаете новый хеш. –

ответ

3

Следующая делает то, что вы спросите:

my @recs; 
while (!eof()) { 
    my %rec; 
    for (1..3) { 
     chomp(my $line = <>); 
     my ($key, $val) = split(/:\s*/, $line, 2); 
     $rec{$key} = $val; 
    } 

    push @recs, \%rec; 
} 

И так делает следующее:

my @recs; 
my $rec; 
while (<>) { 
    chomp; 
    my ($key, $val) = split(/:\s*/, $_, 2); 
    if ($. % 3 == 1) { 
     $rec = {}; 
     push @recs, $rec; 
    } 

    $rec->{$key} = $val; 
} 

Однако, я думаю, что было бы лучше полагаться на записи, начиная с id ключ-значение ,

my @recs; 
my $rec; 
while (<>) { 
    chomp; 
    my ($key, $val) = split(/:\s*/, $_, 2) 
    if ($key eq 'id') { 
     $rec = {}; 
     push @recs, $rec; 
    } 

    $rec->{$key} = $val; 
} 
+0

'$ rec = {}; push @recs, $ rec; 'можно писать более кратко, как' push @recs, $ rec = {}; '(что позволяет переключиться с оператора' if' на модификатор 'if', но последний менее ясный. – ikegami

+0

Поскольку нет ничего плохого, не забудьте удалить свой комментарий, говорящий, что есть? Вы просто сделали '$ rec' анонимным и дублировали некоторый код. – ikegami