假设我有一个如下所示的数组:
@var = ( 1, 59, 120, 181 );
如何在每个元素之间获得一系列步骤,例如:
@var_steps = ( 58, 61, 61 );
我知道我可以使用迭代器为每个索引使用i
和i + 1
执行此操作,但有更好的方法吗?
答案 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];