2015-03-19 72 views
-1

我已經創建了一個%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的相應匹配值。的%hash_1其在%hash_2鍵,然後做%hash_1鍵的映射%hash_2

+1

你通常會得到更好的答案,如果你表現出在解決一些嘗試你自己的問題,並指出你有問題的地方。 – Sobrique 2015-03-19 09:05:11

+0

@Sobrique好的謝謝我將在未來記住這一點!在我以前的大多數問題中,我給出了我自己的代碼,我也嘗試過,並且你也一行一行地糾正了我..非常感謝那:)但是我對哈希有點新,但是肯定我會保留記住:) – Grace90 2015-03-19 09:20:06

+0

可能重複的[如何從下面的文件的內容形成哈希?](http://stackoverflow.com/questions/29093624/how-to-form-hash-from-the-contents-of -the-following-file) – 2015-03-19 10:25:26

回答

1

首先找到值,

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

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

輸出

$VAR1 = { 
     'PIOMUX_UART_0' => 748, 
     'PIOMUX_UART_11' => 567, 
     'PIOMUX2_UART_10' => 244, 
     'PIOMUX_UART_2' => 887 
    }; 
+1

@ Grace90你的第二個散列無效,因爲它不能有多個相同的鍵。 – 2015-03-19 09:18:55

+0

Thankyou理解:)只是有一件事我實際上是我的散列1來自一個不同的perl腳本,所以我正在嘗試要做的只是使用打開我的$處理,'<','file1.pl';高於您建議的代碼。 file1.pl是我將它聲明爲我們的%hash_1的腳本,但它仍然給出不聲明%hash_1的錯誤。 – Grace90 2015-03-19 10:10:32

+1

如果你正在'打開我的$ handle,'<','file1.pl';'你很可能錯過了一些重要的東西。 – 2015-03-19 10:28:41

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, 
} 
+0

好了!這個答案甚至幫助我獲得數組概念的散列。@ hash(@array)...只是讀了它..thankyou soo mch :) – Grace90 2015-03-19 10:56:35

+1

@ Grace90:它不是數組的散列* - 這是別的共! - 它是一個*哈希分片*,而且非常簡單。您只需在大括號之間使用多個鍵,因爲它是一個多值結果,所以在開始處需要一個「@」而不是「$」。 – Borodin 2015-03-19 11:02:53

+0

哦,好吧,它返回多個值,所以@得到它! – Grace90 2015-03-19 11:11:46

相關問題