Perl 垂直索引
文件1的范围为3-9、2-6等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
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
没有检查是否定义了现有键的散列值。那么为什么通常首选它?我想这是吹毛求疵。关于两者之间的区别,您是对的。在这种情况下,我认为这是对键存在性的检查,因为没有定义值的键显然不可能存在。