我正在阅读一个有序的文件,我必须按小时,按分钟或按秒出现。如果需要,我必须打印出现0次(标准化输出)或跳过它们(非标准化输出)。显然必须订购输出。
我首先想到使用数组。当输出未标准化时,我大致相当于:
@array[10] = 100;
@array[10000] = 10000;
打印结果:
foreach (@array) {
print if defined;
}
有没有办法将迭代减少到只有数组中定义的元素?在前面的示例中,这意味着只执行两次迭代,而不是使用$#array
暗示的10000次迭代。然后我还需要一种方法来了解循环中的当前数组索引。这样的事情存在吗?
我正在考虑越来越多地使用哈希。使用哈希解决了我的问题,也消除了将hh:mm:ss转换为索引的需要,反之亦然。
或者你有更好的解决方案来建议这个简单的问题吗?
答案 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();