2016-04-26 45 views
0

我正在编写一个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那是每行中每个第一个数字的总和。

任何帮助或建议?

+3

'push @array,split;' – toolic

+0

你在哪里调用你的子程序? –

回答

4

所以,你想添加一个数组内的所有值。简单,但在你的代码中,你正在添加值的字符串,而不是值本身。

With 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"; 

并定义您的subr outine为:

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

输出将是1937预期。

+0

哇,谢谢。这非常有帮助,我很感激! –