如何基于Perl中的前一个读取行执行操作?

如何基于Perl中的前一个读取行执行操作?,perl,Perl,我仍在学习Perl脚本,需要帮助完成以下任务 Sample data: INV ,GOOD" 2405 INV ,BAD" 42 LOAD ,GOOD" 35588 LOAD ,BAD" 675 TRNS ,GOOD" 6 TRNS ,BAD" 122 我想在GOOD和BAD下面添加值 GOOD, <sum of all good values> BAD, <sum of all bad values> 好, 不好,, 任何人都可以建议我编写代码来读取第一行并将

我仍在学习Perl脚本,需要帮助完成以下任务

Sample data:


INV ,GOOD"
2405
INV ,BAD"
42
LOAD ,GOOD"
35588
LOAD ,BAD"
675
TRNS ,GOOD"
6
TRNS ,BAD"
122
我想在GOOD和BAD下面添加值

GOOD, <sum of all good values>
BAD, <sum of all bad values>
好,
不好,,

任何人都可以建议我编写代码来读取第一行并将下一行的值放入数组中,以便在以后添加它们。

可能是这样的:

while (<>)
{
  $good += <> if (m/GOOD/);
  $bad += <> if (m/BAD/)
}

print "GOOD: $good";
print "BAD: $bad";
while()
{
$good+=if(m/good/);
$bad+=if(m/bad/)
}
打印“好:$GOOD”;
打印“坏:$BAD”;

这只是在进行过程中对值求和并将其打印出来,而不是将它们累加到一个数组中。不过,将其更改为存储中间值并不难。

它可能是这样的:

while (<>)
{
  $good += <> if (m/GOOD/);
  $bad += <> if (m/BAD/)
}

print "GOOD: $good";
print "BAD: $bad";
 use strict;                                     
 use warnings;                                   

 use Data::Dumper;                               

 my %to_sum;                                     
 while (<DATA>) {                                
     /,(GOOD|BAD)"$/;
     next unless $1;                            
     push @{ $to_sum{$1} ||= [] }, scalar <DATA>;
 }                                               
 chomp @$_ for values %to_sum;                   
 print Dumper \%to_sum;                          

 __DATA__                                        
 INV ,GOOD"                                      
 2405                                            
 INV ,BAD"                                       
 42                                              
 LOAD ,GOOD"                                     
 35588                                           
 LOAD ,BAD"                                      
 675                                             
 PIN ,GOOD"                                      
 6                                               
 TRNS ,BAD"                                      
 122                                             
while()
{
$good+=if(m/good/);
$bad+=if(m/bad/)
}
打印“好:$GOOD”;
打印“坏:$BAD”;

这只是在进行过程中对值求和并将其打印出来,而不是将它们累加到一个数组中。不过,将其更改为存储中间值并不难。

下面将数字放入数组中。解析将容忍空行或其他输入,它将等待好或坏,然后使用下一行的数字

 use strict;                                     
 use warnings;                                   

 use Data::Dumper;                               

 my %to_sum;                                     
 while (<DATA>) {                                
     /,(GOOD|BAD)"$/;
     next unless $1;                            
     push @{ $to_sum{$1} ||= [] }, scalar <DATA>;
 }                                               
 chomp @$_ for values %to_sum;                   
 print Dumper \%to_sum;                          

 __DATA__                                        
 INV ,GOOD"                                      
 2405                                            
 INV ,BAD"                                       
 42                                              
 LOAD ,GOOD"                                     
 35588                                           
 LOAD ,BAD"                                      
 675                                             
 PIN ,GOOD"                                      
 6                                               
 TRNS ,BAD"                                      
 122                                             
#!/usr/bin/perl -w
use strict;
use warnings;

my $state = 0;
my $state_good = 1;
my $state_bad  = 2;
my @goods = ();
my @bads = ();


while (my $line = <>) {
        chomp($line);

        if ($line =~ /GOOD/) {
                $state = $state_good;
                next;
        }
        if ($line =~ /BAD/) {
                $state = $state_bad;
                next;
        }
        next if $state == 0;

        if ($state == $state_good) {
                push @goods, $line;
                $state = 0;
        }
        if ($state == $state_bad) {
                push @bads, $line;
                $state = 0;
        }
}


print "sum good: ", sum(@goods), "\n";
print "sum bad:  ", sum(@bads),  "\n";

sub sum {
        my $ret = 0;
        while (@_) {
                my $n = shift;
                $ret += $n;
        }
        return $ret;
}
#/usr/bin/perl-w
严格使用;
使用警告;
我的$state=0;
我的$state\u good=1;
我的$state_bad=2;
我的@goods=();
我的@bads=();
while(我的$line=){
chomp($line);
如果($line=~/GOOD/){
$state=$state\u good;
下一个
}
如果($line=~/BAD/){
$state=$state\u bad;
下一个
}
下一步,如果$state==0;
如果($state==$state\u good){
推@商品,$line;
$state=0;
}
如果($state==$state\u bad){
按@bads$行;
$state=0;
}
}
打印“sum good:”,sum(@goods),“\n”;
打印“sum bad:”,sum(@bads),“\n”;
小计{
我的$ret=0;
而{
我的$n=班次;
$ret+=$n;
}
返回$ret;
}

下面将数字放入数组中。解析将容忍空行或其他输入,它将等待好或坏,然后使用下一行的数字

#!/usr/bin/perl -w
use strict;
use warnings;

my $state = 0;
my $state_good = 1;
my $state_bad  = 2;
my @goods = ();
my @bads = ();


while (my $line = <>) {
        chomp($line);

        if ($line =~ /GOOD/) {
                $state = $state_good;
                next;
        }
        if ($line =~ /BAD/) {
                $state = $state_bad;
                next;
        }
        next if $state == 0;

        if ($state == $state_good) {
                push @goods, $line;
                $state = 0;
        }
        if ($state == $state_bad) {
                push @bads, $line;
                $state = 0;
        }
}


print "sum good: ", sum(@goods), "\n";
print "sum bad:  ", sum(@bads),  "\n";

sub sum {
        my $ret = 0;
        while (@_) {
                my $n = shift;
                $ret += $n;
        }
        return $ret;
}
#/usr/bin/perl-w
严格使用;
使用警告;
我的$state=0;
我的$state\u good=1;
我的$state_bad=2;
我的@goods=();
我的@bads=();
while(我的$line=){
chomp($line);
如果($line=~/GOOD/){
$state=$state\u good;
下一个
}
如果($line=~/BAD/){
$state=$state\u bad;
下一个
}
下一步,如果$state==0;
如果($state==$state\u good){
推@商品,$line;
$state=0;
}
如果($state==$state\u bad){
按@bads$行;
$state=0;
}
}
打印“sum good:”,sum(@goods),“\n”;
打印“sum bad:”,sum(@bads),“\n”;
小计{
我的$ret=0;
而{
我的$n=班次;
$ret+=$n;
}
返回$ret;
}
#/usr/bin/perl
严格使用;
使用警告;
我的$bad=0;
我的$good=0;
而(){
如果(/,好“$/…/^(\d+)$/){
$good+=1美元(如果定义为$1);
}
如果(/,错误“$/…/^(\d+)$/){
$bad+=$1(如果已定义)($1);
}
}
打印“好,$GOOD\n”;
打印“坏,$BAD\n”;
在标量上下文中使用range操作符在manperlop(range操作符)中进行了解释,这非常酷。从Perl食谱6.8中得到了答案。

#/usr/bin/perl
严格使用;
使用警告;
我的$bad=0;
我的$good=0;
而(){
如果(/,好“$/…/^(\d+)$/){
$good+=1美元(如果定义为$1);
}
如果(/,错误“$/…/^(\d+)$/){
$bad+=$1(如果已定义)($1);
}
}
打印“好,$GOOD\n”;
打印“坏,$BAD\n”;

在标量上下文中使用range操作符在manperlop(range操作符)中进行了解释,这非常酷。从Perl食谱6.8中得到答案。

为什么要将它们放入数组而不是仅仅添加它们?为什么要将它们放入数组而不是仅仅添加它们?如果您能评论一下为什么这被评为-1级(以及改进建议),我们将不胜感激。我没有投反对票,但是,当问题需要一个更通用的解决方案时,它似乎是一个高度专业化的解决方案。嗯,这是一个非常出乎意料的解释。我确实打算用一般的方式写作。我经常在解析输入时使用状态变量,在这里我想不同地分析,根据先前行的内容,我认为这是一种非常通用的方法(当然,代码当然是一个特定的实现)。这与lex()中的启动条件大致相似,我认为这是一个完美的解决方案。很明显,它是用与其他解决方案完全不同的哲学编写的,但没有明显的错误,因此否决票有点不必要。答案可能很难阅读,因为它虽然很长,但没有任何注释。我也不确定你对最后一个函数做了什么我还会将变量名更改为更具描述性,例如,$ret改为$result。--我不确定以下变量/函数的用途:sub、my、$\uN和shift。请评论一下为什么将其评为-1级(以及改进建议)。我没有投反对票,但当问题需要更通用的解决方案时,这似乎是一个高度专业化的解决方案。嗯,这是一个非常出乎意料的解释。我确实打算用一般的方式写作。我经常在解析输入时使用状态变量,在这里我想不同地分析,根据先前行的内容,我认为这是一种非常通用的方法(当然,代码当然是一个特定的实现)。这与lex()中的开始条件大致相似,我认为这是一个完美的cromu