返回Perl中最后一个非零元素索引的优雅方法?

时间:2014-07-28 15:12:38

标签: arrays perl

我发现自己想要找到数组中最后一个非零元素的索引。所以,给定:

my @array = (0,0,5,9,0,0,0,7,0,3,0,0);
my $indexLastNonZero = insertElegantMethodHere(@array);
# expect $indexLastNonZero to be equal to 9;

我做到了这一点:

for my $i (0 .. $#array) {
    $indexLastNonZero = $i if $array[$i] != 0;
};

我工作,但不知怎的,我不禁觉得必须有一个超级优雅(更聪明?更好?更高效?)在perl中这样做的方式。我已经查看了List :: Utils,但没有找到一个很好的方法,并希望一个非核心模块独立的方法。

有什么想法吗?

干杯

6 个答案:

答案 0 :(得分:13)

使用List::MoreUtils执行此类任务:

use warnings;
use strict;

use List::MoreUtils;

my @array = (0,0,5,9,0,0,0,7,0,3,0,0);

print List::MoreUtils::lastidx { $_ } @array

答案 1 :(得分:5)

my @array = (0,0,5,9,0,0,0,7,0,3,0,0);
my ($indexLastNonZero) = grep $array[$_], reverse 0 .. $#array;

答案 2 :(得分:5)

从数组的末尾开始并向后工作,直到找到非零元素:

my @array = (0,0,5,9,0,0,0,7,0,3,0,0);

my $i = $#array;
$i-- while $i >= 0 && $array[$i] == 0;

print "The last non-zero element is at index $i\n";

$i >= 0测试用于防止所有元素都为零的边缘情况。在这种情况下,$i的结果值为-1。

答案 3 :(得分:1)

您可以使用List::Util,它位于核心:

use strict;
use warnings; 

use List::Util qw(first);

my @array = (0,0,5,9,0,0,0,7,0,3,0,0);
my $index = @array;

first { $index-- && $_ } reverse @array;

print "Last index that is non-zero: $index\n"; 

答案 4 :(得分:0)

破坏性方法所以首先获取数组的副本:

my @array2 = @array;
while (!pop @array2) {} # Remove up to and including the last non-zero
print scalar @array2;   # Size of remaining elements is index of last non-zero

答案 5 :(得分:0)

sub last_true {
    pop and return scalar @_ while @_;
    undef;
}

my $index = last_true(@foo);