开始使用perl中的数字解析行

时间:2011-07-17 20:06:50

标签: perl

我有以下文件

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 个答案:

答案 0 :(得分:3)

很难说为什么它“不起作用”,因为我不知道你是如何检查它是否有效。但这就是你的代码看起来的样子。

使用词法文件句柄。使用数组而不是散列(您可以混合和匹配)。 $_在分割和/../中自动使用。不要使用复杂的哈希引用,只需指定一个匿名哈希。

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;

答案 1 :(得分:0)

无需将整个文件读入内存,只需将其拆分为行并迭代行。这将使程序的内存占用量与整个输入文件的大小成比例。

另一方面,逐行读取文件将使该占用空间与最长行的大小成比例,后者往往要小得多。当您打算逐行处理文件时,逐行读取文件也会使您的代码更简单。

#!/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