代码之家  ›  专栏  ›  技术社区  ›  sayth

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

  •  2
  • sayth  · 技术社区  · 6 年前

    我有一个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 回复  |  直到 6 年前
        1
  •  8
  •   ikegami Gilles Quénot    6 年前

    偶数/奇数起诉的总和(你要求的,但不是你想要的 〔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. 我包括这些,以防有人在这个问答中需要这些土地。
        2
  •  5
  •   zdim    6 年前

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

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

    测试注意事项:对于偶数指数(0,2,4),我们有(奇数!)值(1,3,5),在此( 1..6 实例

        3
  •  4
  •   JGNI    6 年前

    你可以利用这个事实 ?: 运算符是可分配的

    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,则将 @条形码 $even 否则 $odd .

    这看起来很奇怪,直到您记住数组是基于0的,所以您的第一个条形码编号存储在 $barcode[0] 这是一个偶数指数。

        4
  •  3
  •   ysth    6 年前

    chomp( my @barcode = //, <STDIN> ); 大概是应该有一个 split 之前 // ?

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

    最好先嚼一嚼,这样你的数字就在数组中了:

    chomp(my $barcode = <STDIN>);
    my @barcode = split //, $barcode;
    
        5
  •  3
  •   stack0114106    6 年前

    另一个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
    
    $