如何从两个哈希创建单个哈希,其中一个哈希的值是另一个哈希的键的子集?

时间:2015-03-19 08:49:16

标签: perl

我创建了一个%hash_1

      'PIOMUX2_UART_10' => 'PIO_M_U_PIO1_0'
      'PIOMUX_UART_11' => 'PIO_M_U_PIO0_4'
      'PIOMUX_UART_2' => 'PIO_M_U_PIO23_3'
      'PIOMUX_UART_0' => 'PIO_M_U_PIO21_0'

和另一个%hash_2

    'PIO_M_U_PIO1_0'  =>  244
    'PIO_M_U_PIO0_4'  =>  567
    'PIO_M_U_PIO23_3'  =>  568
    'PIO_M_U_PIO21_0'  =>  748
    'PIO_M_U_PIO23_3'  =>  099
    'PIO_M_U_PIO23_3',  =>  887

hash_1中的键值是hash_2中键的子集。我只想知道是否有任何方法可以将hash_1的键直接指向hash_2的值,并创建另一个hash_3,其中hash_1的键可以与相应的匹配来自hash_2的值。

2 个答案:

答案 0 :(得分:2)

不确定。你需要的只是一些哈希切片。 (但请注意,您的%hash_2实际上只有四个元素,因为您的三个键是相同的。)

use strict;
use warnings;

my %hash_1 = (
  PIOMUX2_UART_10 => "PIO_M_U_PIO1_0",
  PIOMUX_UART_0   => "PIO_M_U_PIO21_0",
  PIOMUX_UART_11  => "PIO_M_U_PIO0_4",
  PIOMUX_UART_2   => "PIO_M_U_PIO23_3",
);

my %hash_2 = (
  PIO_M_U_PIO1_0  =>  244,
  PIO_M_U_PIO0_4  =>  567,
  PIO_M_U_PIO23_3 =>  568,
  PIO_M_U_PIO21_0 =>  748,
  PIO_M_U_PIO23_3 =>  '099',
  PIO_M_U_PIO23_3 =>  887,
);

my %hash_3;
@hash_3{keys %hash_1} = @hash_2{values %hash_1};

use Data::Dump;
dd \%hash_3;

<强>输出

{
  PIOMUX2_UART_10 => 244,
  PIOMUX_UART_0   => 748,
  PIOMUX_UART_11  => 567,
  PIOMUX_UART_2   => 887,
}

答案 1 :(得分:1)

首先查找%hash_1的{​​{1}}值,然后将%hash_2键映射到%hash_1值,

%hash_2

输出

my %hash_3 = map { $_ =>  $hash_2{$hash_1{$_}} } 
  grep { exists $hash_2{$hash_1{$_}} }
  keys %hash_1;

use Data::Dumper; print Dumper \%hash_3;