Начать разбор строки с числа в perl - PullRequest
0 голосов
/ 18 июля 2011

У меня есть следующий файл

something in this line  2
something in this line  3
something in this lin 4
something in this line 5
something in this line 6
something in this line 6
something in this line 7


value   text   Read      Write
------------------------------------------------
1        1      82090    62337
2        2      27177    39042
3        3      73       5708
4        4      170      749

Теперь мне нужно разобрать файлы и получить строки, начинающиеся с цифры. Я использую $ _ = ~ m / ^ \ d + /. Но это не похоже на работу.

#!/usr/bin/perl
use strict;
use warnings;

my $data = do {local $/; <INFILE>};
my $hash = ();

foreach (split(/\n/, $data)) {
    print "printing $_\n";
    if ($_ =~ m/^\d+/) {
        my @temp = split('[\s\t]+', $_);
        $hash->{$temp[0]}->{read} = $temp[2];
        $hash->{$temp[0]}->{write} = $temp[3];
    }
}
return ($hash);

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Трудно сказать, почему это "не работает", так как я не знаю, как вы проверяете, работает ли он.Но так должен выглядеть ваш код.

Используйте лексический дескриптор файла.Используйте массив вместо хеша (вы можете смешивать и сопоставлять).$_ используется автоматически в разбиении и /../.Вместо использования сложных ссылок на хеш, просто назначьте анонимный хеш.

my @array;
while (<$infile>) {
    if (/^[0-9]/) {
        my @data = split;
        $array[$data[0]] = { 'read'  => $data[2], 'write' => $data[3] };
    }
}

return \@data;

Я не знаю, почему вы используете return, так как это ключевое слово для подпрограмм.Вот как все прошло:

use Data::Dumper;
print Dumper \@data;
0 голосов
/ 19 июля 2011

Нет необходимости читать весь файл в память только для того, чтобы разбить его обратно на строки и выполнить итерации по строкам.Это сделает объем памяти вашей программы пропорциональным размеру всего входного файла.

С другой стороны, чтение файла построчно будет сохранять этот объем пропорциональным размеру самой длинной строки., который, как правило, гораздо меньше.Чтение файлов построчно, когда вы собираетесь обрабатывать их построчно, также сделает ваш код проще.

#!/usr/bin/perl

use warnings; use strict;
use YAML;

print Dump process_file(\*DATA);

sub process_file {
    my ($fh) = @_;

    my %hash;

    while ( my $line = <$fh> ) {
        next unless $line =~ /^[0-9]/;
        my ($val, undef, $read, $write) = split ' ', $line;
        @{ $hash{ $val } }{qw( read write )} = ($read, $write);
    }

    return \%hash;
}

__DATA__
something in this line  2
something in this line  3
something in this lin 4
something in this line 5
something in this line 6
something in this line 6
something in this line 7


value   text   Read      Write
------------------------------------------------
1        1      82090    62337
2        2      27177    39042
3        3      73       5708
4        4      170      749
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...