如何在perl中添加每个数组的值?

时间:2014-08-12 06:58:58

标签: perl

添加每个数组的元素怎么样。?

@a1 = (1..5);
@a2 = (1..3);
@a3 = (1..4);
@tar = ("@a1", "@a2", "@a3");
foreach $each(@tar){
        @ar = split(' ',$each);
        foreach $eac(@ar){
        $tot+=$eac;
        }
print "$each total is: $tot\n";
}

在这段代码中给出输出,但是后续总值加上前面的总值。但我期待输出:

1 2 3 4 5 total is: 15
1 2 3 total is: 6
1 2 3 4 total is: 10

3 个答案:

答案 0 :(得分:2)

问题是因为你在每个foreach循环中使用相同的变量$ tot。所以它保留了旧的价值。简单的解决方法是在每个循环中首先将$ tot定义为词法变量。

#!/usr/bin/perl
@a1 = (1..5);
@a2 = (1..3);
@a3 = (1..4);
@tar = ("@a1", "@a2", "@a3");
foreach $each(@tar){
        my $tot;
        @ar = split(' ',$each);
        foreach $eac(@ar){
        $tot+=$eac;
        }
print "$each total is: $tot\n";
}

输出

1 2 3 4 5 total is: 15
1 2 3 total is: 6
1 2 3 4 total is: 10

答案 1 :(得分:0)

如果你想让$ tot的范围只是在循环中,只需在循环中声明它:

for $each (@tar) {
    my $tot;

答案 2 :(得分:0)

一些提示:

  1. 始终在每个perl脚本中包含use strict;use warnings;。没有例外

  2. 始终使用my声明您的变量,并使用尽可能小的范围。

  3. 研究perldsc - Perl Data Structures Cookbook以了解使用数组和数组引用的其他方法。

  4. 这些更改会将您的脚本清理为以下符号:

    use strict;
    use warnings;
    
    my @a1 = (1..5);
    my @a2 = (1..3);
    my @a3 = (1..4);
    
    my @AoA = (\@a1, \@a2, \@a3);
    
    for my $arrayref (@AoA){
        my $total = 0;
        for my $val (@$arrayref) {
            $total += $val;
        }
        print "@$arrayref total is: $total\n";
    }
    

    输出:

    1 2 3 4 5 total is: 15
    1 2 3 total is: 6
    1 2 3 4 total is: 10