如何访问If / else范围之外的值

时间:2009-11-17 04:33:09

标签: perl conditional

我有一对像这样的数据:

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

这样做的正确方法是什么?

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”更好