弹出数组的键来计算总数

时间:2013-11-13 18:45:41

标签: arrays perl file-io pop

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

输入文件:

Samsung   46
RIM       16
Apple     87
Microsoft 30

我的代码编译......但它只返回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;

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

<强>输出

179

答案 2 :(得分:2)

use strict;
use warnings;
open my $fh, "<", "units.txt" or die "well...";

my $total = 0;
while(<$fh>){
chomp;
my ($string, $num) = split(" ", $_);
$total += $num;
}
print $total;

答案 3 :(得分:0)

这个问题很简单:

$ perl -ane '$sum += $F[1] }{ print $sum' units.txt

<强>解释

  • -a启用autosplit,每行split并存储在@F
  • -n逐行循环遍历文件
  • -e告诉perl下一个参数将被视为Perl代码
  • 对于输入文件中的每一行执行Eskimo-kiss的LHS(中间那个看起来很滑稽的}{),RHS只执行一次
  • LHS累积$sum
  • 中每一行的第二列
  • 一旦处理完所有行,RHS就会打印$sum的结果