分别求和数组的奇数和偶数索引-Perl

时间:2019-01-30 08:44:26

标签: perl

我有11个元素的数组。在这里,我想将包括第一个和最后一个元素的奇数元素作为一个标量,而将偶数作为另一个标量。

这是我的代码,我试图使用map向每个索引添加2来获得结果,但是我认为我做错了。

use strict;
use warnings;
use Data::Dumper;

print 'Enter the 11 digiet serial number: ';
chomp( my @barcode = //, <STDIN> );

my @sum1 = map { 2 + $_ } $barcode[1] .. $barcode[11];
my $sum1 = sum Dumper( \@sum1 );

# sum2 = l2 + l4 + l6 + r8 + r10;
printf "{$sum1}";

什么是实现此目标的好方法?

5 个答案:

答案 0 :(得分:8)

偶数/奇数索引的总和(您要的是,而不是您想要的 [1] ):

use List::Util qw( sum );   # Or: sub sum { my $acc; $acc += $_ for @_; $acc }

my $sum_of_even_idxs = sum grep { $_ % 2 == 0 } 0..$#nums;
my $sum_of_odd_idxs  = sum grep { $_ % 2 == 1 } 0..$#nums;

偶数/奇数值的总和(您也要的,但不是您想要的 [1] ):

use List::Util qw( sum );   # Or: sub sum { my $acc; $acc += $_ for @_; $acc }

my $sum_of_even_vals = sum grep { $_ % 2 == 0 } @nums;
my $sum_of_odd_vals  = sum grep { $_ % 2 == 1 } @nums;

偶数/奇数索引(您想要的)的值总和:

use List::Util qw( sum );   # Or: sub sum { my $acc; $acc += $_ for @_; $acc }

my $sum_of_vals_at_even_idxs = sum @nums[ grep { $_ % 2 == 0 } 0..$#nums ];
my $sum_of_vals_at_odd_idxs  = sum @nums[ grep { $_ % 2 == 1 } 0..$#nums ];

鉴于您知道有多少个元素,可以使用以下内容:

use List::Util qw( sum );   # Or: sub sum { my $acc; $acc += $_ for @_; $acc }

my $sum_of_vals_at_even_idxs = sum @nums[0,2,4,6,8,10];
my $sum_of_vals_at_odd_idxs  = sum @nums[1,3,5,7,9];

  1. 我将这些内容包括在内,以防有人在本问答中需要这些土地。

答案 1 :(得分:5)

将奇数和偶数索引的值相加

perl -wE'@ary = 1..6;  
    for (0..$#ary) { $_ & 1 ? $odds += $ary[$_] : $evens += $ary[$_] }; 
    say "odds: $odds, evens: $evens"
'

测试注意事项:在这个(1..6)示例中,对于偶数索引(0,2,4),我们有(奇数!)值(1、3,5)

答案 2 :(得分:4)

您可以使用?:运算符是可分配的事实

print 'Enter the 11 digiet serial number: ';
chomp( my @barcode = //, <STDIN> );

my $odd = 0;
my $even = 0;
for (my $index = 0; $index < @barcode; $index++) {
    ($index % 2 ? $even : $odd) += $barcode[$index];
}

这可以通过在@barcode上进行索引并采用索引的mod 2来实现,即将索引除以2并取余数;如果余数为1,则将@barcode的元素添加到{ {1}}否则为$even

这看起来很奇怪,直到您记住数组是基于0的,所以条形码的第一个数字存储在偶数索引$odd中。

答案 3 :(得分:3)

chomp( my @barcode = //, <STDIN> );应该在split之前有//

@barcode将读取该行中的所有字符,包括换行符。 chomp将把最后一个元素从换行符更改为空字符串。

最好先排骨,以便将数字放在数组中

chomp(my $barcode = <STDIN>);
my @barcode = split //, $barcode;

答案 4 :(得分:3)

另一个Perl,如果字符串的长度为11并且仅包含数字

$ perl -le ' $_="12345678911"; s/(.)(.)|(.)$/$odd+=$1+$3;$even+=$2/ge; print "odd=$odd; even=$even" '
odd=26; even=21

$

使用不同的输入

$ perl -le ' $_="12121212121"; s/(.)(.)|(.)$/$odd+=$1+$3;$even+=$2/ge; print "odd=$odd; even=$even" '
odd=6; even=10

$