如何外部访问值的if/else范围

如何外部访问值的if/else范围

问题描述:

我有一个来自于对这样的数据:如何外部访问值的if/else范围

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 

怎样做正确的方式?

+2

你的代码工作我的系统上完全正常(与更换为了测试起见)。你看到了什么行为,你如何设置DATA? – atk 2009-11-17 04:42:05

#!/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 


#!/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 
    } 
} 


虽然使用正则表达式来组号(如思南的代码)比采用分体式更好。
另外,我觉得它更好地使用明确的指标,而不是“-1”的最后一个元素

你的代码,我的系统上工作,所以我不知道你有什么问题。

这里有一个不同的方式来做到这一点:

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;