在Perl中,如何检查数组元素之间的步骤?

时间:2013-11-18 08:06:32

标签: perl

假设我有一个如下所示的数组:

@var = ( 1, 59, 120, 181 );

如何在每个元素之间获得一系列步骤,例如:

@var_steps = ( 58, 61, 61 );

我知道我可以使用迭代器为每个索引使用ii + 1执行此操作,但有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

my @var = ( 1, 59, 120, 181 );
my @var_steps = map { $var[$_+1] - $var[$_] } 0 .. $#var-1;

use List::MoreUtils qw(pairwise);
my @a1 = @var[0..$#var-1];
my @a2 = @var[1..$#var];
my @var_steps = pairwise { $b - $a } @a1, @a2;

答案 1 :(得分:0)

我找到map的解决方案很好,但这是另一个看看它。使用辅助函数:

sub zip_with(&\@\@) {
    my ($f, $xs, $ys) = @_;
    my @zs;

    my $min = @$xs < @$ys ? @$xs : @$ys;
    for my $i (0 .. $min - 1) {
        push @zs, &$f($$xs[$i], $$ys[$i]);
    }
    return @zs;
}

你可以得到这样的相邻差异:

my @var_steps = zip_with { $_[1] - $_[0] } @vars, @vars[1..$#vars];