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

moi*_*scr 4 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;
Run Code Online (Sandbox Code Playgroud)

我这样做了:

for my $i (0 .. $#array) {
    $indexLastNonZero = $i if $array[$i] != 0;
};
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

干杯

Ren*_*ger 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
Run Code Online (Sandbox Code Playgroud)


Сух*_*й27 5

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

  • @moigescr你的方法已经很有效了(`for(0 .. $#arr)`内部没有生成列表)如果你喜欢`$ array [$ _]和$ indexLastNonZero = $ _为0,你可以缩短它. .$#array;` (2认同)

Mic*_*man 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";
Run Code Online (Sandbox Code Playgroud)

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