Perl:组合两个哈希数组的值并使第二个数组的值成为输出哈希的键

Posted

技术标签:

【中文标题】Perl:组合两个哈希数组的值并使第二个数组的值成为输出哈希的键【英文标题】:Perl: Combining the values of two arrays of hashes and making the values of the second array the keys of the output hash 【发布时间】:2020-12-21 09:46:02 【问题描述】:

对不起,如果我所说的哈希数组是别的东西。从现在开始,我将把这些东西称为“结构”。 无论如何, 假设我有两个结构:

my @arrayhash;
push(@arrayhash, '1234567891234' => 'A1');
push(@arrayhash, '1234567890123' => 'A2');

my @arrayhash2;
push(@arrayhash2, '1234567891234' => '567');
push(@arrayhash2, '1234567890123' => '689');

我怎样才能得到输出:

@output= 
  '567' => 'A1',
  '689' => 'A2',

这两种结构中都不会缺少元素,也不会出现“undef”值。

【问题讨论】:

您的哈希值能否包含多个键值对?哈希是否以相同的顺序添加到数组中,即如果我在数组的索引 5 中找到键 xyz 的哈希,我是否保证相同的键 xyz 将在数组 2 的索引 5 中?还是它们的顺序不同? 是的,两个散列都有多个(且数量相等)的键值对,但顺序不是给定的。 好的,谢谢,每个键是否保证只出现一次?键 xyz 是否可能出现在数组中的多个哈希中?如果是这样,决定使用哪个值的规则应该是什么? 每个键只能出现一次 【参考方案1】:

您可以创建一个临时哈希值,用于在两者之间进行映射。

#!/usr/bin/perl

use strict;
use warnings;

my @arrayhash;
push @arrayhash, '1234567891234' => 'A1';
push @arrayhash, '1234567890123' => 'A2';

my @arrayhash2;
push @arrayhash2, '1234567891234' => '567';
push @arrayhash2, '1234567890123' => '689';

my %hash; # temporary hash holding all key => value pairs in arrayhash
foreach my $h (@arrayhash) 
    while( my($k,$v) = each %$h) 
        $hash$k = $v;
    


my %output;
foreach my $h (@arrayhash2) 
    while( my($k,$v) = each %$h) 
        $output$v = $hash$k;
    


my @output=(\%output);

【讨论】:

【参考方案2】:
# Build $merged$long_key = [ $key, $val ];
my %merged;
for (@arrayhash2) 
   my ($k, $v) = %$_;
   $merged$k[0] = $v;
   

for (@arrayhash) 
   my ($k, $v) = %$_;
   $merged$k[1] = $v;


my %final = map @$_, values(%merged);

# Build $lookup$long_key = $key;
my %lookup;
for (@arrayhash2) 
   my ($k, $v) = %$_;
   $lookup$k = $v;
   

my %final;
for (@arrayhash) 
   my ($k, $v) = %$_;
   $final $lookup$k  = $v;

【讨论】:

以上是关于Perl:组合两个哈希数组的值并使第二个数组的值成为输出哈希的键的主要内容,如果未能解决你的问题,请参考以下文章

华为OJ平台——整形数组合并

合并数组的值并对重复值求和

在 Swift 中删除 Unwrapped 并使其成为可选? [复制]

对一个阵列进行排序并使其他两个阵列保持同步

从 perl 数组/哈希打印信息

如何将文本放在第一个输入的右侧,并使第二个输入附近的文本更宽?