【问题标题】:Popping keys of an array to calculate a total弹出数组的键以计算总数
【发布时间】:2013-11-13 18:45:41
【问题描述】:

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

输入文件:

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;

【问题讨论】:

  • my @lines = &lt;UNITS&gt;; 读取文件的所有行,没有留给while (&lt;UNITS&gt;) 读取。然后是pop @lines 没有意义的问题。您需要一行的最后一个字段,而不是最后一行。
  • 你可能是想说 while(@lines),但 pop @lines 会返回整行,计算结果为 0,因此你将在 $total 中添加 0。您需要为该数字解析每一行
  • @Davs:您应该将其作为答案提出

标签: arrays perl file-io


【解决方案1】:

如果您只是想用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

【讨论】:

  • 我喜欢 (split)[1],这将有助于解决我即将遇到的一些问题。谢谢!
  • (split)[-1] 可能是一个更好的猜测,因为第一列似乎包含公司名称,并且很可能包含空格。
  • @Nicktard:除非您只处理每条记录的一个字段,否则最好使用 my @fields = split 提取 所有 字段,然后从中选择您想要的数据那里(在这种情况下$fields[1])。另请注意我之前的评论:如果您的任何数据中有空格,那么一个裸露的split 会将单个字段分成多个字段。
【解决方案2】:

这里有三个问题

  • 您正在尝试添加类似'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

【讨论】:

    【解决方案3】:
    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;
    

    【讨论】:

    • 您的代码非常好,但很好的答案也解释了他们为什么这样做。您介意添加一些解释,并适当缩进代码吗?
    【解决方案4】:

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

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

    说明

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

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 2021-10-08
      • 2019-12-11
      相关资源
      最近更新 更多