2009-11-17 109 views
2

我有一個來自於對這樣的數據:如何外部訪問值的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

回答

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 
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 
    } 
} 


雖然使用正則表達式來組號(如思南的代碼)比採用分體式更好。
另外,我覺得它更好地使用明確的指標,而不是「-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;