我有以下文件
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);
答案 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