0

以下是我尝试处理的输入文件中的几行典型行:

ICC2_DPD  2.7V  ma  0.006 0.006 0.006  ... ... 
DPD_Rel   2.7V  ma  0.062 0.054 0.040 0.065 0.037 0.066 0.071 0.073 ... ... ...

(浮动的数量可能会有所不同)这是我最初开始的:

if(/^(\w+)\s+(\d+\.?\d*)V\s+(\w+)/) 
{
    print $OUT "$1 $2 $3\n";
}

鉴于值的数量不同,您将如何捕获浮点值并将其存储到数组/散列中。我被困在如何管理阵列的终止上。

4

2 回答 2

4

好吧,在您的情况下,我可能会考虑使用split,分隔空格上的字段:

while (<DATA>) {
    my @vals = split;   # default split is fine
    print join(" ", @vals[3 .. $#vals]), "\n";
}

或者,如果您想存储它们,只需将它们推送到数组中,或者使用带有合适键的散列。就像是...

push @array,      [ @vals[3 .. $#vals] ];  # push an array ref
$hash{$vals[0]} = [ @vals[3 .. $#vals] ];  # use a hash

[ ... ]部分正在创建一个匿名数组 ref,然后可以将行的值存储在单个标量槽中。

于 2013-07-31T23:29:12.890 回答
0

我可能倾向于写这样的东西:

#!/usr/bin/env perl

use strict;
use warnings;

use List::Util qw( sum );

my @data;

while (my $line = <DATA>) {
    my ($state, $voltage, $current_unit, $obs) = split ' ', $line, 4;
    my @obs = ($obs =~ / ( [0-9] [.] [0-9]+ )/gx);
    push @data, {
        state => $state,
        voltage => $voltage,
        current_unit => $current_unit,
        obs => \@obs,
        average_current => sum(@obs) / @obs,
    };
}

for my $x (@data) {
    printf(
        "State = %-16sAverage current = %.3f%s\n",
        @$x{qw(state average_current current_unit)},
    );
}

__DATA__
ICC2_DPD  2.7V  ma  0.006 0.006 0.006
DPD_Rel   2.7V  ma  0.062 0.054 0.040 0.065 0.037 0.066 0.071 0.073

输出:

状态 = ICC2_DPD 平均电流 = 0.006ma
状态 = DPD_Rel 平均电流 = 0.059ma
于 2013-08-02T01:54:09.397 回答