Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 垂直索引_Perl_Sum_Range - Fatal编程技术网

Perl 垂直索引

Perl 垂直索引,perl,sum,range,Perl,Sum,Range,文件1的范围为3-9、2-6等 3 9 2 6 12 20 文件2有值:第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 = <FILE

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

3 9
2 6
12 20
文件2有值:第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;
            }
    }
}}
open(FILE1,“FILE1.txt”);
打开(FILE2,“FILE2.txt”);
@file1=;
@file2=;
foreach(@file1)
{
@split_file2=split(“\\s”,$);//按空间分割文件
foreach(@file2)
{
@split_file2=split(“\\s”,$);//按空间分割文件
if(@split_file1[0]==@split_file2[0])//如果file1的column0与file2的column0匹配
{
$x+=@split_file2[1];//对file2的第1列求和
if(@split_file2[0]==@split_file1[0])//直到file1的column1=file2的column0。
{
最后;
}
}
}}
  • 始终使用
    严格使用;使用警告
  • split/\s/
    更容易阅读<代码>拆分“”
    是您实际需要的
  • 不要使用全局变量(例如,文件句柄)
  • 如果只通过添加
    或die$,检查
    打开
    是否成功非常有用
  • 使用有意义的名称,而不是
    file1
    file2

使用严格;
使用警告;
使用特征qw(例如);
使用列表::Util qw(总和);
my$file1='file1.txt';
my$file2='file2.txt';
我的@file2;
{    
打开(我的$fh,
  • 始终使用
    使用严格;使用警告;
  • split/\s/
    更容易阅读。
    split'
    才是您真正想要的
  • 不要使用全局变量(例如,文件句柄)
  • 如果只添加
    或die$!
    ,检查
    打开是否成功是很有用的
  • 使用有意义的名称,而不是
    file1
    file2

使用严格;
使用警告;
使用特征qw(例如);
使用列表::Util qw(总和);
my$file1='file1.txt';
my$file2='file2.txt';
我的@file2;
{    
打开(my$fh),另一个解决方案:

#!/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;
!/usr/bin/perl
严格使用;
使用警告;
我的$f1=班次;
我的$f2=班次;
打开FH1,“另一个解决方案:

#!/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;
!/usr/bin/perl
严格使用;
使用警告;
我的$f1=班次;
我的$f2=班次;


打开FH1,“这段代码看起来很伤脑筋。在尝试用它编写程序之前,你仍然应该先学习基本的Perl。说你赶时间,不会让人们更快地回答这个问题:-)很好地格式化你的代码可能会。研究如何将
List::Util
中的
sum
函数与数组片段一起使用,例如
sum(@file2[$range1..$range2])
。这段代码看起来很伤脑筋。在尝试用基本Perl编写程序之前,你仍然应该先学习它。说你很匆忙,不会让人们更快地回答问题:-)可能会很好地格式化您的代码。研究如何将
List::Util
中的
sum
函数与数组切片一起使用,例如
sum(@file2[$range1..$range2])
split/
很少是任何人想要的。很可能是
split'
或只是
split
说sum@file2[$start..$end]
如果范围的每个元素都保证存在就足够了。@Borodin,是的,这是我在编写注释时纠正的一个输入错误。删除未定义的值可能会隐藏输入错误,例如范围12..20和给定的数据。@TLP,我不认为这是一个错误,但我确实给了他两个选项
split/
是很少是任何人想要的。很可能是
split'
或只是
split
说sum@file2[$start..$end]
如果保证范围中的每个元素都存在就足够了。@Borodin,是的,这是我在编写注释时纠正的一个输入错误。删除未定义的值可能会隐藏输入错误,例如范围12..20和给定的数据。@TLP,我不认为这是一个错误,但我确实给了他这两个错误options@dan1111谢谢你的帮助输入后,我相应地更改了我的答案。但是,
exists
不会检查是否定义了现有密钥的哈希值。为什么通常会选择它?我想这一点是吹毛求疵。关于两者之间的差异,您是对的。在这种情况下,我认为这是检查密钥是否存在,因为密钥thout out a defined value显然不存在。@dan1111感谢您的输入,我相应地更改了答案。但是,
exists
没有检查是否定义了现有键的散列值。那么为什么通常首选它?我想这是吹毛求疵。关于两者之间的区别,您是对的。在这种情况下,我认为这是对键存在性的检查,因为没有定义值的键显然不可能存在。