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 を作成しています。これにより、ラインの値を 1 つのスカラー スロットに格納できます。

于 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 に答える