如何在perl中减去数组中的值?

时间:2014-07-18 16:16:06

标签: perl

如何用前面的值减去后续值?

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。如何打印特定输出?

4 个答案:

答案 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;