将每列添加到数组,而不仅仅是整行 - PERL

时间:2016-04-26 23:15:23

标签: arrays perl

我正在编写一个perl脚本,目前正在编写一个子例程来对数组的所有值求和。目前,我的代码只读取每一行并将整行存储到每个数组元素中。我需要将每个单独的数字存储在它自己的元素中。

以下是我的数据示例:

50 71 55 93 115
45 76 49 88 102
59 78 53 96 145
33 65 39 82 100
54 77 56 98 158

这是我的代码:

my @array;

 #bring in each line and store into array called 'array'
 open(my $fh, "<", "score")
     or die "Failed to open file: $!\n";
 while(<$fh>) { 
     chomp; 
     push @array, $_;
 } 
 close $fh;

当我调用我的子程序来对数组的值求和时,我的结果是241.这是每行中每个第一个数字的总和。

任何帮助或建议?

1 个答案:

答案 0 :(得分:4)

因此,您希望在数组中添加所有值。简单,但在您的代码中,您正在添加值的字符串而不是值本身。

使用push @array, $_;,您将在文件score中创建一系列行。

尝试:

print Dumper(\@array);

您将看到如下输出:

$VAR1 = [
          '50 71 55 93 115',
          '45 76 49 88 102',
          '59 78 53 96 145',
          '33 65 39 82 100',
          '54 77 56 98 158'
        ];

因此,当您添加值时,它会添加数组的所有元素:

'50 71 55 93 115' + '59 78 53 96 145' + '33 65 39 82 100' ......and so on

当您将+与字符串放在一起时,它被视为数字,默认情况下,perl将字符串中的第一个字符添加到另一个字符串中的第一个字符。如果第一个字符不是数字,则将其视为0。 您应该查看perlop以获取更多信息。

此问题的解决方案是将数字与每行分开,单独处理它们并将它们存储在数组中。这可以简单地使用:

push @array, split;

现在尝试:

print Dumper(\@array);

会是这样的:

$VAR1 = [
          '50',
          '71',
          '55',
          '93',
          '115',
          '45',
          '76',
          '49',
          '88',
          '102',
          '59',
          '78',
          '53',
          '96',
          '145',
          '33',
          '65',
          '39',
          '82',
          '100',
          '54',
          '77',
          '56',
          '98',
          '158'
        ];

在此之后,只需使用:

调用您的子程序
my $total_sum = sum(@array);
print $total_sum,"\n";

并将您的子程序定义为:

sub sum {
    my @nums = @_;
    my  $total_sum = 0;
    $total_sum += $_ foreach(@nums);
    return $total_sum;
}

按预期输出 1937