gpt4 book ai didi

arrays - Perl 列表中的多散列

转载 作者:行者123 更新时间:2023-12-02 09:35:19 25 4
gpt4 key购买 nike

我有一个列表,其中包含一些连接的值。我需要使用列表中的键和值创建一个 HashMap 并将其合并在一起。但我真的不知道该怎么做。

输入:

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

预期输出:

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

我已经尝试过这些:

(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);

}

在第二种情况下,我收到错误,因为当循环变量 i=1 时,键/值已经存在,所以也许我必须检查之前添加的键/值。但我真的不知道该怎么做。我真的很感激任何想法。

最佳答案

只需使用 push将新成员添加到散列的散列中的现有数组中。您必须使用 @{ ... } 取消引用数组引用。

#!/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;

输出

$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'
]
}
};

关于arrays - Perl 列表中的多散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27039070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com