如何用前面的值减去后续值?
use warnings;
use strict;
my @hus = qw(7 9 12 16 20 21);
my ($i,$j);
for($i = 0; $i <= $#hus; $i++){
for($j = 1; $j <= $#hus; $j++){
my $m = $hus[$j]-$hus[$i];
print "$m\n";
}
}
在此程序中给出输出。但我希望特定输出如2 3 4 4 1.此输出来自9-7 = 2,12-9 = 3,16-12 = 4,20-16 = 4,21-20 = 1。如何打印特定输出?
答案 0 :(得分:4)
你可以非常紧凑地做到这一点:
use strict;
use warnings;
my @hus = qw(7 9 12 16 20 21);
print $hus[$_] - $hus[$_-1], "\n" for 1 .. $#hus;
表达式1 .. $#hus
生成一个从1到数组@hus
的最后一个元素的索引的数字列表。 for
循环遍历此列表,将当前值分配给特殊变量$_
。这意味着您感兴趣的两个元素位于$_
的{{1}}和$_-1
位置。
输出:
@hus
答案 1 :(得分:2)
您只需要遍历数组一次。
use warnings;
use strict;
my @hus = qw( 7 9 12 16 20 21 );
for (my $i = 0; $i < $#hus; ++$i) {
my $m = $hus[$i+1] - $hus[$i];
print "$m\n";
}
输出:
2
3
4
4
1
答案 2 :(得分:2)
您正在计算远期差异。它可以像这样完成
use strict;
use warnings;
my @hus = qw( 7 9 12 16 20 21 );
my @diff = map { $hus[$_] - $hus[$_-1] } 1 .. $#hus;
print "@diff\n";
<强>输出强>
2 3 4 4 1
<强>更新强>
也许您想要在问题中显示的输出?你可以这样做
use strict;
use warnings;
my @hus = qw(7 9 12 16 20 21);
print join ', ', map {
my ($i, $j) = @hus[$_-1, $_];
sprintf('%d-%d=%d', $j, $i, $j-$i);
} 1 .. $#hus;
print "\n";
<强>输出强>
9-7=2, 12-9=3, 16-12=4, 20-16=4, 21-20=1
答案 3 :(得分:1)
您需要对6个元素进行5次迭代,或者更一般地说,您需要循环次数少于@hus
中的元素数量。这整个嵌套循环方法是错误的,因为$i
应始终小于$j
。修正:
my ($i,$j);
for ($j = 1; $j <= $#hus; $j++) {
my $i = $j-1;
my $m = $hus[$j]-$hus[$i];
print "$m\n";
}
但是,让我们清理一下。
for my $i (1..$#hus) {
print $hus[$i]-$hus[$i-1], "\n";
}
您甚至可以将其减少到以下内容:
say $hus[$_]-$hus[$_-1] for 1..$#hus;