次のような配列があるとします。
@var = ( 1, 59, 120, 181 );
どのようにして各要素の間に一連のステップを得ることができますか?
@var_steps = ( 58, 61, 61 );
私はイテレータを使ってこれを行うことができることを知っています i
そして i + 1
各インデックスについて、より良い方法がありますか?
回答:
回答№1は4my @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;
回答№2の場合は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];