Как добавить массив к хэш-значениям

У меня есть некоторые значения и корни, которые генерируют эти значения. Например, в формате значение-корень.

100-0
200-1
300-2
100-2
400-1
300-3
100-3

Теперь мне нужно создать Hash массивов в Perl в следующем формате. ключи 100, 200, 300, 400; и значения, соответствующие каждому ключу, приведены ниже (так же, как корни значений).

100-0,2,3
200-1
300-2,3
400-1

Я даю код, который я написал, чтобы добиться того же. Но значение для каждого ключа равно нулю.

Нижеприведенная часть кода находится внутри цикла, в котором он предоставляет разные числа корней на каждой итерации в $root_num. В приведенном выше примере это 100, 200, 300, 400.

Корневой номер равен 100, 200, 300 и 400 на каждой итерации.

my %freq_and_root;
my @HFarray = ();
my @new_array = ();

if(exists $freq_and_root{$freq_value}) 
{
    @HFarray = @{ $freq_and_root{$freq_value} };
    $new_array[0] = $root_num;
    push(@HFarray,$new_array[0]);
    $freq_and_root{$freq_value} = [@HFarray] ;
} else {  
    $new_array1[0] = $root_num;
    $freq_and_root{$freq_value} = $new_array1[0];
}  

Наконец, после цикла я печатаю хэш следующим образом:

foreach ( keys %freq_and_root) {  
    print "$_ => @{$freq_and_root{$_}}\n";
}  

Ниже приведен вывод: мне не хватает первого элемента в каждой паре "ключ-значение"
100-2 3
200-
300-3
400-

Кроме того, как я могу обработать хеш, чтобы корни не повторялись в разных значениях ключа, а корень должен быть там в ключе с наибольшим числом, значения ключа хэша будут следовать в этом случае

100-0
200-
300-2 3
400-1


person Navaneeth Cp    schedule 25.02.2020    source источник
comment
Превратите показанный фрагмент кода в один минимально воспроизводимый пример.   -  person Yunnosch    schedule 25.02.2020


Ответы (1)


Посмотрите, соответствует ли следующий код вашим требованиям

use strict;
use warnings;
use feature 'say';

my %data;

while(<DATA>) {                          # walk through data
    chomp;                               # snip eol
    my($root,$value) = split '-';        # split into root and value
    push @{$data{$root}}, $value;        # fill 'data' hash with data
}

foreach my $root(sort keys %data) {      # sort roots
    say "$root - " . join ',', @{$data{$root}};  # output root and values
}

__DATA__
100-0
200-1
300-2
100-2
400-1
300-3
100-3

Вывод

100 - 0,2,3
200 - 1
300 - 2,3
400 - 1
person Polar Bear    schedule 25.02.2020