如何外部访问值的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
怎样做正确的方式?
答
#!/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;
你的代码工作我的系统上完全正常(与更换为了测试起见)。你看到了什么行为,你如何设置DATA? – atk 2009-11-17 04:42:05