Как объединить два отдельных массива в ha sh in perl без потери избыточных значений? - PullRequest
3 голосов
/ 18 июня 2020

У меня есть два массива:

@arr  = qw(feature1 feature2 feature3);
@arr2 = qw(prod1 prod2 prod3 prod4);

Мне нужен последний ha sh in perl, который будет выглядеть так:

%hash = {
  feature1 => prod1,
  feature2 => prod2,
  feature3 => qw(prod3 prod4)
};

Чтобы объединить два массива, которые я использовал :

@hash{@feat} = @prod;
print Dumper \%hash;

Как мне этого добиться?

Ответы [ 3 ]

2 голосов
/ 18 июня 2020

То, что вы хотите, невозможно, так как у вас не может быть списка значений, связанных с ключом feature3. Вместо этого вам понадобится ссылка на массив.

Вы не можете сделать это в одном задании (или, по крайней мере, я не могу придумать, как это сделать), но это кажется сделать это относительно просто.

#!/usr/bin/perl

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

use Data::Dumper;

my @feat = qw(feature1 feature2 feature3);
my @prod = qw(prod1 prod2 prod3 prod4);

my %hash;

if (@feat == @prod) {
  @hash{@feat} = @prod;
} else {
  @hash{@feat[0 .. $#feat - 1]} = @prod[0 .. $#feat - 1];
  $hash{$feat[$#feat]} = [ @prod[$#feat .. $#prod] ];
}

say Dumper \%hash;

Обратите внимание: предполагается, что либо ваши два массива имеют одинаковую длину, либо @feat короче @prod.

1 голос
/ 18 июня 2020

Я не уверен, можно ли это сделать с помощью одного задания, но это один из способов сделать это. Примечание: все значения являются ссылками на массив или undef, если @arr2 короткое. Если вам не нужен undef, вам нужно расширить оператор if.

use strict;

use Data::Dumper;

my @arr1=qw(feature1 feature2 feature3);
my @arr2=qw(prod1 prod2 prod3 prod4);

my %hash;
# if @arr2 is shorter than @arr1 then final hash values will be undef
if (@arr2 > @arr1) {
  @hash{splice(@arr1, 0, $#arr1)} = map { \[$_] } splice(@arr2, 0, $#arr1);
  $hash{$arr1[$#arr1]} = [ splice(@arr2, $#arr1) ]
} else {
  @hash{@arr1}=map { \[$_] } @arr2;
}

print Dumper(\%hash);
0 голосов
/ 19 июня 2020

Получил ответ на задачу

*

Решил по ссылкам. В ha sh ключи должны быть уникальными, а значение может быть избыточным. Я хотел иметь "feature3 => qw (prod3 prod4)", и я добился этого, используя ссылку, в которой я создал пустой массив ref и вставлял значения каждый раз, когда появлялся ключ.

Пожалуйста, проверьте «Ссылка в perl" Больше подробностей. Это очень помогло: https://mojolicious.org/perldoc/perlreftut

Спасибо!

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