迭代Perl数组的最有效方法是什么?

时间:2012-10-30 13:52:25

标签: perl

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

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

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

打印结果:

foreach (@array) {
  print if defined;
}

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

我正在考虑越来越多地使用哈希。使用哈希解决了我的问题,也消除了将hh:mm:ss转换为索引的需要,反之亦然。

或者你有更好的解决方案来建议这个简单的问题吗?

2 个答案:

答案 0 :(得分:6)

是的,使用哈希。如果您的键正确排序,您可以迭代哈希键的有序数组。

答案 1 :(得分: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();