我试图简单地弹出每个数值并将它们加在一起以获得总数。
输入文件:
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;
答案 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 strict
和use 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代码}{
),RHS只执行一次$sum
$sum
的结果