1

我正在阅读一个我必须按小时、按分钟或按秒计算的有序文件。如果要求,我必须打印 0 次出现的时间(标准化输出)或跳过它们(非标准化输出)。输出显然必须是有序的。

我首先想到的是使用数组。当输出未标准化时,我大致相当于:

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

并打印结果:

foreach (@array) {
  print if defined;
}

有没有办法将迭代减少到仅在数组中定义的元素?在前面的示例中,这意味着只进行两次迭代,而不是使用$#array暗示的 10000 次。然后我还需要一种方法来知道循环中的当前数组索引。这样的事情存在吗?

我越来越多地考虑使用哈希来代替。使用哈希解决了我的问题,也消除了将 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 回答