1

時間単位、分単位、または秒単位の出現回数をカウントする必要がある順序付きファイルを読み取っています。要求された場合、発生回数が0の時間を出力するか(正規化された出力)、スキップする必要があります(正規化されていない出力)。出力は明らかに順序付けする必要があります。

私は最初に配列を使うことを考えました。出力が正規化されていない場合、私はおおよそ次のことを行っています。

@array[10] = 100;
@array[10000] = 10000;

そして結果を印刷するには:

foreach (@array) {
  print if defined;
}

配列で定義された要素のみに反復を減らす方法はありますか?前の例では、これは、使用が意味する10000ではなく、2回の反復のみを実行することを意味し$#arrayます。次に、ループ内の現在の配列インデックスを知る方法も必要になります。そのようなものは存在しますか?

代わりにハッシュを使うことをますます考えています。ハッシュを使用すると、私の問題が解決し、hh:mm:ss回をインデックスに変換する必要もなくなります。その逆も同様です。

または、この単純な問題を提案するためのより良い解決策がありますか?

4

2 に答える 2

6

はい、ハッシュを使用します。キーが正しくソートされている場合は、ハッシュのキーの順序付けられた配列を反復処理できます。

于 2012-10-30T13:58:24.207 に答える
2

配列内の数字のペアだけを覚えておくこともできます。

#!/usr/bin/perl
use warnings;
use strict;

my @ar = ( [  10, 100 ],
           [ 100,  99 ],
           [  12,   1 ],
           [  13,   2 ],
           [  15,   1 ],
         );

sub normalized {
    my @ar = sort { $a->[0] <=> $b->[0] } @_;
    map "@$_", @ar;
}

sub non_normalized {
    my @ar = sort { $a->[0] <=> $b->[0] } @_;
    unshift @ar, [0, 0] unless $ar[0][0] == 0;
    my @return;
    for my $i (0 .. $#ar) {
        push @return, "@{ $ar[$i] }";
        push @return, $_ . $" . 0 for 1 + $ar[$i][0] .. $ar[$i + 1][0] - 1;
    }
    return @return;
}


print join "\n", normalized(@ar), q();
print "\n";
print join "\n", non_normalized(@ar), q();
于 2012-10-30T14:10:26.330 に答える