Perl Array Values ​​Доступ и сумма по каждому уникальному ключу - PullRequest
0 голосов
/ 21 ноября 2011
# 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);

Я получаю ошибки Необъявленная ошибка при добавлении (+) Если я использую 2-ую печать, я получаю значения HASH (0x19a69451), если я использую 1-ю печать.Я прошу вас исправить меня.

Мой вывод должен быть

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

Ответы [ 3 ]

5 голосов
/ 21 ноября 2011

Это неправильно:

"c:\";

Perl читает это как строку, начинающуюся с c:";\n....Или, другими словами, это бегущая строка.Вам нужно написать последний символ как \\, чтобы экранировать \ и не допустить выхода из следующего " символа

2 голосов
/ 21 ноября 2011

Возможно, вы захотите использовать вместо скобок парены:

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

Вы получите предупреждение Unintialized error at addition (+), если массив @sum имеет нечетное количество элементов.

См.также perltidy .

0 голосов
/ 21 ноября 2011

Не следует вводить второй цикл while:

while my $key (@sum) {

, поскольку предыдущий оставил массив @sum пустым.

Вы можете изменить на:

while (<$input>) {
    chomp;
    my @tmp = split(/\|/);
    $hash{$tmp[3]} += $tmp[6];
}
print Dumper \%hash;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...