【发布时间】:2019-10-23 00:21:51
【问题描述】:
我有一个格式如下的文本文件:
1 4730 1031782 init
4 0 6 events
2190 450 0 top
21413 5928 1 sshd
22355 1970 2009 find
我需要对第二列数据求和并将该值返回给用户。
我当前尝试从文本文件中读取数据,如下所示:
sub read_file{
my $data_failed = 1;
my $file = 'task_file';
if (-z $file){print "No tasks found\n";}
if(open (INFILE, "task_file" || die "$!\n")){
my @COLUMNS = qw( memory cpu program );
my %sort_strings = ( program => sub { $a cmp $b } );
my (%process_details, %sort);
while (<INFILE>) {
$data_failed = 0;
my ($process_id, $memory_size, $cpu_time, $program_name) = split;
$process_details{$process_id} = { memory => $memory_size,
cpu => $cpu_time,
program => $program_name };
undef $sort{memory}{$memory_size}{$process_id};
undef $sort{cpu}{$cpu_time}{$process_id};
undef $sort{program}{$program_name}{$process_id};
}
for my $column ($COLUMNS[2]) {
my $cmp = $sort_strings{$column} || sub { $a <=> $b };
for my $value (sort $cmp keys %{ $sort{$column} }
) {
my @pids = keys %{ $sort{$column}{$value} };
say join ' ', $_, @{ $process_details{$_} }{@COLUMNS}
for @pids;
}
}
if($total_memory_size == 1){
sum_memory_size();
}
} else { print "No tasks found"}
}
我尝试对这些值求和:
sub sum_memory_size{
my @do_sum = qw(memory_size);
my $column;
my $value;
for $column (keys %{ $sort{$column}{$value} }) {
my $found;
my $sum = 0;
for $value (@do_sum) {
next unless exists $sort{$column}{$value};
$sum += $hash{$column}{$value};
delete $hash{$column}{$value};
$found = 1;
}
$sort{$column}{somename} = $sum if $found;
}
print $sum;
}
【问题讨论】:
-
到目前为止你尝试了什么?
-
@Chris 编辑显示我的尝试
-
不要将
DATA用于真正的文件句柄,它是一个特殊的句柄(参见perldata)。 -
好的,我现在正在使用 INFILE
-
最好使用词法文件句柄而不是裸词句柄。
标签: perl multiple-columns text-processing