我有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}";
什么是实现此目标的好方法?
答案 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 :(得分: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
$