弹出数组的键来计算总数

Nic*_*ard 2 arrays perl file-io

我试图简单地弹出每个数值并将它们加在一起以获得总数.

输入文件:

Samsung   46
RIM       16
Apple     87
Microsoft 30
Run Code Online (Sandbox Code Playgroud)

我的代码编译...但它只返回0.

open (UNITS, 'units.txt') || die "Can't open it $!";
my @lines = <UNITS>;
my $total = 0;
while (<UNITS>) {
    chomp;
    my $line = pop @lines;
    $line += $total;
}
print $total;
Run Code Online (Sandbox Code Playgroud)

too*_*lic 5

如果你只是想用它来循环遍历它们,就不需要将所有行都插入到数组中while.此外,您需要split每行获取您的号码.

use warnings;
use strict;

open (UNITS, 'units.txt') || die "Can't open it $!";
my $total = 0;
while (<UNITS>) {
    chomp;
    my $num = (split)[1];
    $total += $num;
}
print "$total\n";

__END__

179
Run Code Online (Sandbox Code Playgroud)

  • `(split)[ - 1]`可能是一个更好的猜测,因为第一列似乎由公司名称组成,并且它很可能包含空格. (2认同)

Bor*_*din 5

这里有三个问题

  • 您正在尝试添加字符串 'Samsung 46' + 'RIM 16'

  • 您将整个文件读入@lines,然后尝试从while循环中的文件中读取更多内容.永远不会输入该循环,因为您已经读取到文件结尾

  • 您正在循环中添加$total(未声明的)变量$line,而不是相反.所以$total保持为零,并$line保持零添加

while除非您需要对记录进行顺序访问以外的其他操作,否则最好使用读取文件,因此删除@lines是一个开始.

目前还不完全清楚你想要积累哪部分记录.该程序将空行分割为空白,并将每行的最后一个字段加在一起.

你必须始终 use strictuse warnings在每个程序的开头.这是一种措施,可以更容易地找到代码中的错误.最好使用词法文件句柄而不是你使用的全局句柄和三参数形式open.

use strict;
use warnings;

open my $units, '<', 'units.txt' or die "Can't open it: $!";

my $total;

while (<$units>) {
  my @fields = split;
  $total += $fields[-1];
}
print $total;
Run Code Online (Sandbox Code Playgroud)

产量

179
Run Code Online (Sandbox Code Playgroud)