如何用前一个值减去后一个值?
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。如何打印特定的输出?
发布于 2014-07-19 00:28:31
您可以非常简洁地完成此操作:
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循环遍历该列表,将当前值赋给特殊变量$_。这意味着您感兴趣的两个元素分别位于@hus的位置$_和$_-1。
输出:
2
3
4
4
1发布于 2014-07-19 00:20:51
您只需要遍历数组一次。
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发布于 2014-07-19 01:04:32
您正在计算向前差异。它可以像这样简单地完成
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=1https://stackoverflow.com/questions/24829611
复制相似问题