2

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

输入文件:

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

4 回答 4

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
于 2013-11-13T18:53:59.083 回答
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
于 2013-11-13T18:50:04.797 回答
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;
于 2013-11-13T18:50:47.160 回答
0

这个问题是一个单行的轻而易举:

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

解释

  • -a启用自动拆分,每一行都split存储在@F
  • -n逐行循环文件
  • -e告诉perl下一个参数将被视为 Perl 代码
  • 对输入文件中的每一行执行爱斯基摩之吻的 LHS(中间看起来很有趣}{),RHS 只执行一次
  • LHS 累加每行的第二列$sum
  • $sum处理完所有行后,RHS 打印结果
于 2013-11-13T20:28:25.467 回答