我正在编写一个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.这是每行中每个第一个数字的总和。
任何帮助或建议?
答案 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
。