简体   繁体   中英

Perl multi hash from list

I have a list with some values which are connected. I need to create a hashmap with keys and values from the list and merge together. But i don't really know how to do it.

Input:

my @in =( 
'mgenv/1_2_3/parent.dx_environment',
'mgenv/1_2_3/doc/types.dat');

Expected output:

"{ $env => { $ver => [ $file1, $file2, ... ] } }" 

I've tried these:

(1)

my @sack_files = (
    'mgenv/1_2_3/parent.dx_environment',
    'mgenv/1_2_3/doc/types.dat');
    my $sack_tree = {};
    my %hash=();

    for( my $i=0; $i<scalar @sack_files; $i++){
        my @array = split(/[\/]+/,$sack_files[$i]);

        for(my $i=0;$i<(scalar @array)-1;$i++){
            my $first = $array[$i];
            my $second = $array[$i+1];
            $hash{$first}=$second;
            }

            # merge
    }

(2)

use Data::Dumper;

my @sack_files = (
    'mgenv/1_2_3/parent.dx_environment',
    'mgenv/1_2_3/doc/types.dat',
);

my $sack_tree = {};
my %hash=();

for( my $i=0; $i<scalar @sack_files; $i++){
    my @array = split(/[\/]+/,$sack_files[$i]);
    nest(\%hash,@array);

}

In the second case I get an error because when the loop variable i=1 ,the key/values already exists so maybe i have to check the previously added key/values. But I don't really know how. I would really appreciate any ideas.

Just use push to add new members to an existing array in a hash of hashes. You have to dereference the array reference with @{ ... } .

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

use Data::Dumper;

my @sack_files = qw( mgenv/1_2_3/parent.dx_environment
                     mgenv/1_2_3/doc/types.dat
                     mgenv/1_2_3/doc/etc.dat
                     mgenv/4_5_6/parent.dx_environment
                     mgenv/4_5_6/doc/types.dat
                     u5env/1_2_3/parent.dx_environment
                     u5env/1_2_3/doc/types.dat
                     u5env/4_5_6/parent.dx_environment
                     u5env/4_5_6/doc/types.dat
                  );
my %hash;

for my $sack_file (@sack_files) {
    my ($env, $ver, $file) = split m{/}, $sack_file, 3;
    push @{ $hash{$env}{$ver} }, $file;
}

print Dumper \%hash;

output

$VAR1 = {
  'mgenv' => {
    '1_2_3' => [
      'parent.dx_environment',
      'doc/types.dat',
      'doc/etc.dat'
    ],
    '4_5_6' => [
      'parent.dx_environment',
      'doc/types.dat'
    ]
  },
  'u5env' => {
    '4_5_6' => [
      'parent.dx_environment',
      'doc/types.dat'
    ],
    '1_2_3' => [
      'parent.dx_environment',
      'doc/types.dat'
    ]
  }
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM