我有一对像这样的数据:
A: 100
B: 3.3
A: 210
B: 4.3
我想用下面的代码做的是对每对的值求和:
my $aval = "";
my $bval = "";
while (<DATA>) {
chomp;
if (/^A/) {
$aval = (split(" ",$_))[-1];
}
else {
$bval = (split(" ",$_))[-1];
my $total = $aval + $bval;
print "$total\n";
}
}
然而,上面的代码似乎并不像我希望的那样做。
特别是在else
内,$aval
的值仍为空。
我希望获得的最终结果是:
103.3
214.3
这样做的正确方法是什么?
答案 0 :(得分:3)
#!/usr/bin/perl
use strict; use warnings;
my $aval = 0;
while ( <DATA> ) {
if ( /^A: (\S+)/ ) {
$aval = $1;
}
elsif ( /^B: (\S+)/ ) {
print $aval + $1, "\n";
$aval = 0;
}
}
__DATA__
A: 100
B: 3.3
A: 210
B: 4.3
答案 1 :(得分:2)
您的代码在我的系统上运行,因此我不确定您遇到了什么问题。
这是一种不同的方式:
chomp(my @data = <DATA>);
s![a-z:\s]!!ig for @data;
print shift(@data) + shift(@data), "\n" while @data;
或者,你不想破坏性地这样做:
# Create @data as above.
my @sums;
$sums[int($_ / 2)] += $data[$_] for 0 .. $#data;
print $_, "\n" for @sums;
答案 2 :(得分:0)
#!/usr/bin/perl -w
my $aval = "";
my $bval = "";
my $total = "";
open(DATA,"<data") ;
while (<DATA>) {
chomp;
$num = (split(" ",$_))[1] ;
if (/^A/)
{
$aval = $num ;
}
elsif (/^B/)
{
$bval = $num;
$total = $aval + $bval;
print "$total\n";
}
else
{
// can handle any other input
}
}
虽然使用正则表达式对数字进行分组(如在Sinan的代码中)比使用split更好 此外,我发现最后一个元素
使用显式索引而不是“-1”更好