【问题标题】:Perl, how to only add numbers in each row of a filePerl,如何只在文件的每一行中添加数字
【发布时间】:2016-07-04 17:38:23
【问题描述】:

我有一个文本文件,看起来类似于:

1 Bob J Smith 3 4 2 1 10 8
2 James Miller 5 3 82 3 44 1
3 ...

我想要实现的是只添加每行中的数字并给出每人的总数。但必须跳过第一个数字(即名称之前)和文本,只计算数字。我的@lines 数组包含我需要使用的文件。

my $total;
my @row;
foreach(@lines){
        @row=split;
        $total=0;
        $total+=$_ for @row[3..$#row];
        print "$row[0]: $total\n";
}
print "$row[0]: $total\n";

【问题讨论】:

  • 这是作业吗?问作业问题很好,但你应该说如果是这样,你得到的答案应该更适合帮助你学习,而不仅仅是获得结果
  • 不,不是,只是我正在做的一个教程,以增加我的 perl 知识
  • @Borodin 他去step by step 询问他是否卡住了。我很感激。

标签: perl file


【解决方案1】:

将文件读入数组然后迭代数组通常不会比仅迭代文件有所改进。您不应该将整个文件读入内存,除非您出于某种原因特别需要,例如需要随机访问数据

除非您实际上有 制表符 将名称与周围的字段分开,否则您的数据格式不是很有用。否则就无法将名称的一部分与其他字段区分开来

此程序的工作原理是将每行的最后两个字段重复相加,直到最后一个字段,但其中一个不是数字。它假定每行的最后一个字段始终是数字,并且不对此进行任何检查

use strict;
use warnings 'all';

while ( <DATA> ) {

    my @fields = split;

    while ( $fields[-2] =~ /\A\d+\z/ ) {
        push @fields, pop(@fields) + pop(@fields);
    }

    print "@fields\n";
}

__DATA__
1 Bob J Smith 3 4 2 1 10 8
2 James Miller 5 3 82 3 44 1

输出

1 Bob J Smith 28
2 James Miller 138

【讨论】:

    【解决方案2】:

    或者使用正则表达式将每一行分成名称和数字,然后将数字相加。

    while (<DATA>)
    {  
        chomp;
        next if /^$/;
        my $total = 0;
        /\d+ ([A-Za-z ]+) ([\s\d]+)$/;
        my @numbers = split(' ', $2);
        $total += $_ for (@numbers);
        print "$1: $total\n";
    }
    
    __DATA__
    1 Bob J Smith 3 4 2 1 10 8
    2 James Miller 5 3 82 3 44 1
    3 Allan X Smith 5 4 82 3 44 2
    

    【讨论】:

      【解决方案3】:

      可能更简单直接:

      use strict;
      use warnings;
      
      use List::Util 'sum';
      
      while ( <DATA> ) {
          my @row = split;
      
          print shift @row, ' '; # print row number
      
          while (@row and $row[0] !~ /^\d+$/) { # print name
              print shift @row, ' ';
          }
      
          print sum(@row, 0), $/;
      }
      
      __DATA__
      1 Bob J Smith 3 4 2 1 10 8
      2 James Miller 5 3 82 3 44 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 2012-04-13
        • 1970-01-01
        • 2012-01-02
        • 2017-11-28
        • 2011-02-21
        相关资源
        最近更新 更多