0

文件 1 的范围为 3-9、2-6 等

3 9
2 6
12 20

File2 有值:第 1 列表示范围,第 2 列有值。

1   4
2   4
3   5
4   4
5   4
6   1
7   1
8   1
9   4

我想计算file1中范围的值总和(file2,column2)。例如:如果范围是 3-9,那么值的总和将为 5+4+4+1+1+1+4 = 20

我尝试过的是:

open (FILE1,"file1.txt");
open (FILE2,"file2.txt");

@file1 = <FILE1>;
@file2 = <FILE2>;

foreach (@file1)
    {
        @split_file2 = split("\\s",$_); //splitting the file by space


foreach (@file2)
    {
        @split_file2 = split("\\s",$_);  //splitting the file by space


if (@split_file1[0] == @split_file2[0]) //if column0 of file1 matches with column0 of file2
    {
        $x += @split_file2[1];  //sum the column1 of file2 

       if ( @split_file2[0] == @split_file1[0] ) //until column1 of file1 = column0 of file2.

            {
            last;
            }
    }
}}
4

2 回答 2

3
  • 始终使用use strict; use warnings;.
  • split /\s/更容易阅读。split ' '是你真正想要的。
  • 不要使用全局变量(例如文件句柄)。
  • 检查是否成功很有用open,如果只添加or die $!.
  • 使用有意义的名称,而不是file1and file2

use strict;
use warnings;
use feature qw( say );

use List::Util qw( sum );

my $file1 = 'file1.txt';
my $file2 = 'file2.txt';

my @file2;
{    
   open(my $fh, '<', $file2)
      or die "Can't open $file2: $!\n";
   while (<$fh>) {
      my ($k, $v) = split;
      $file2[$k] = $v;
   }
}

{    
   open(my $fh, '<', $file1)
      or die "Can't open $file1: $!\n";
   while (<$fh>) {
      my ($start, $end) = split;
      say sum grep defined, @file2[$start .. $end];
   }
}
于 2013-02-22T10:51:39.490 回答
0

另一种解决方案:

#!/usr/bin/perl

use strict;
use warnings;

my $f1 = shift;
my $f2 = shift;
open FH1, "<", $f1 or die "$!\n";
open FH2, "<", $f2 or die "$!\n";

my %data;

while (<FH1>) {
    $data{$1} = $2 if ($_ =~ m/^(\d+)\s+(\d+)$/);
}

while (<FH2>) {
    if ($_ =~ m/^(\d+)\s+(\d+)$/) {
        my $sum;
        for ($1..$2) {
            $sum += $data{$_} if defined($data{$_});
        }
        print "sum for $1-$2: $sum\n" if defined($sum);
    }
}

close FH1;
close FH2;

称呼:script.pl values.txt ranges.txt

于 2013-02-22T11:06:51.933 回答