Как получить доступ к значению вне области видимости If / else - PullRequest
2 голосов
/ 17 ноября 2009

У меня есть данные, которые идут в паре, как это:

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 ]

3 голосов
/ 17 ноября 2009
#!/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
2 голосов
/ 17 ноября 2009

Ваш код работал в моей системе, поэтому я не уверен, с какой проблемой вы столкнулись.

Вот другой способ сделать это:

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;
0 голосов
/ 17 ноября 2009

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


Хотя использование регулярных выражений для группирования чисел (как в коде Синан) лучше, чем использование split.
Кроме того, я считаю, что лучше использовать явный индекс вместо "-1" для последнего элемента

...