perl: добавить пару хешей к большему хешу - PullRequest
0 голосов
/ 27 января 2012

У меня сгенерирована хеш-таблица, которую я затем пытаюсь добавить в большую хеш-таблицу (если она уникальна) для каждого из нескольких файлов, но у меня возникают проблемы с синтаксисом, и я продолжаю случайно вызывать значения или создавать хэшхэш.Все, что я хочу сделать, это превратить:

(The actual $hash key) => $hash{$key};

в

 $compound_hash{$key} = $hash{$key};


В настоящее время у меня есть:

    if ($file_no == 0){
            while (my ($key, $value) = each %hash){
                    $compound_hash{$key} = $value;
            }       

    }else{
            while (my ($key, $value) = each %compound_hash){

                    if (exists $hash{$key}){
                            print "$key: exists\n";
                            $compound_hash{$key} .= ",$hash{$key}";
                    }else{
                          print "$key added\n";  
                          XXXXXXX
                    }

Конечным результатом является объединение значения хеша в конце каждой строки, что делает .csv, то есть

     abc,0,32,45
     def,21,43,23
     ghi,1,49,54

1 Ответ

3 голосов
/ 27 января 2012

Трудно сказать точно, но я думаю, что вы ищете что-то вроде этого:

for my $key (keys %hash) {  # for all new keys
     if (exists $compound_hash{$key}) {  # if we have seen this key
          $compound_hash{$key} .= ",$hash{$key}"  # append it to the csv
     }
     else {
          $compound_hash{$key} = $hash{$key}  # otherwise create a new entry
     }
}

В моем собственном коде я мог бы настроить %compound_hash для первоначального заполнения ссылками на массивы,которые затем объединяются в строки после заполнения данных.

for my $key (keys %hash) {
     push @{ $compound_hash{$key} }, $hash{$key}
}

, а затем позже

for my $value (values %compound_hash) {
    $value = join ',' => @$value
}

, что будет более эффективно, чем многократное добавление данных в строки, содержащиеся в соединении.хэш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...