Perl数组值按每个唯一键访问和求和

时间:2011-11-21 15:45:48

标签: perl

# my code as follows
use strict;
use FileHandle;

my @LISTS       = ('incoming');
my $WORK        ="c:\";
my $OUT         ="c:\";

foreach my $list (@LISTS) {
    my $INFILE      = $WORK."test.dat";
    my $OUTFILE     = $OUT."TEST.dat";

    while (<$input>) {
        chomp;
        my($f1,$f2,$f3,$f4,$f5,$f6,$f7) = split(/\|/);
        push @sum, $f4,$f7;
    }

}
while (@sum) {
    my ($key,$value)=  {shift@sum, shift@sum};
    $hash{$key}=0;
    $hash{$key} += $value;
}
while my $key (@sum) {
    print $output2 sprintf("$key1\n");
    # print $output2 sprintf("$key ===> $hash{$key}\n");
}
close($input);
close($output);

我收到错误添加未初始化错误(+)如果我使用第二次打印 如果我使用1st Print,我会得到HASH(0x19a69451)值。 我请你纠正我。

我的输出应该是

unique Id ===> Total Revenue ($f4==>$f7)

3 个答案:

答案 0 :(得分:5)

这是错误的:

"c:\";

Perl将其读作以c:";\n...开头的字符串。或者换句话说,它是一个逃跑的字符串。您需要将最后一个字符写为\\以转义\并阻止它转义后续的"字符

答案 1 :(得分:2)

您可能想要使用parens而不是大括号:

my ($key, $value) = (shift @sum, shift @sum);

如果Unintialized error at addition (+)数组的元素数量奇数,您会收到@sum警告。

另见perltidy

答案 2 :(得分:0)

你不应该进入第二个while循环:

while my $key (@sum) {

因为前一个数组使数组@sum为空。

您可以更改为:

while (<$input>) {
    chomp;
    my @tmp = split(/\|/);
    $hash{$tmp[3]} += $tmp[6];
}
print Dumper \%hash;